




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第九章預處理命令
本章要點預處理的概念C語言處理系統(tǒng)的預處理功能預處理命令的使用
主要內(nèi)容九.一宏定義九.二“文件包含”處理九.三條件編譯
基本概念ANSIC標準規(guī)定可以在C源程序中加入一些“預處理命令”以改進程序設(shè)計環(huán)境提高編程效率這些預處理命令是由ANSIC統(tǒng)一規(guī)定的但是它不是C語言本身的組成部分不能直接對它們進行編譯因為編譯程序不能識別它們必須在對程序進行通常的編譯之前先對程序中這些特殊的命令進行“預處理”經(jīng)過預處理后程序可由編譯程序?qū)︻A處理后的源程序進行通常的編譯處理得到可供執(zhí)行的目標代碼
基本概念C語言與其他高級語言的一個重要區(qū)別是可以使用預處理命令和具有預處理的功能C提供的預處理功能主要有以下三種:一.宏定義二.文件包含三.條件編譯這些功能分別用宏定義命令、文件包含命令、條件編譯命令來實現(xiàn)為了與一般C語句相區(qū)別這些命令以符號“?!遍_頭例如:
#define#include
九.一宏定義九.一.一不帶參數(shù)的宏定義
宏定義一般形式為:#define標識符字符串例如:#definePI三.一四一五九二六宏定義的作用是在本程序文件中用指定的標識符PI來代替“三.一四一五九二六”這個字符串在編譯預處理時將程序中在該命令以后出現(xiàn)的所有的PI都用“三.一四一五九二六”代替這種方法使用戶能以一個簡單的名字代替一個長的字符串這個標識符名字稱為“宏名”在預編譯時將宏名替換成字符串的過程稱為“宏展開”#define是宏定義命令#include<stdio.h>#definePI三.一四一五九二六voidmain{floatlsrv;printf"inputradius:";scanf"%f"&r;l=二.0*PI*r;s=PI*r*r;v=四.0/三*PI*r*r*r;printf"l=%一0.四f\ns=%一0.四f\nv=%一0.四f\n"lsv;}例九.一使用不帶參數(shù)的宏定義
inputradius:四↙
運行情況如下:一=二五.一三二八s=五0.二六五五v=一五0.七九六六一宏名一般習慣用大寫字母表示以便與變量名相區(qū)別但這并非規(guī)定也可用小寫字母二使用宏名代替一個字符串可以減少程序中重復書寫某些字符串的工作量三宏定義是用宏名代替一個字符串只作簡單置換不作正確性檢查只有在編譯已被宏展開后的源程序時才會發(fā)現(xiàn)語法錯誤并報錯說明:四宏定義不是C語句不必在行末加分號如果加了分號則會連分號一起進行置換五#define命令出現(xiàn)在程序中函數(shù)的外面宏名的有效范圍為定義命令之后到本源文件結(jié)束通常#define命令寫在文件開頭函數(shù)之前作為文件一部分在此文件范圍內(nèi)有效六可以用#undef命令終止宏定義的作用域例如:說明:#defineG九.八_______voidmain↑{G的有效范圍
…}-----↓----#undefGf一{…}在f一函數(shù)中G不再代表九.八這樣可以靈活控制宏定義的作用范圍七在進行宏定義時可以引用已定義的宏名可以層層置換說明:#include<stdio.h>#defineR三.0#definePI三.一四一五九二六#defineL二*PI*R#defineSPI*R*Rvoidmain{printf"L=%f\nS=%f\n"LS;}運行情況如下:L=一八.八四九五五六S=二八.二七四三三三例九.二在宏定義中引用已定義的宏名
經(jīng)過宏展開后printf函數(shù)中的輸出項L被展開為:
二*三.一四一五九二六*三.0S展開為
三.一四一五九二六*三.0*三.0printf函數(shù)調(diào)用語句展開為:printf“L=%F\NS=%f\n”二*三.一四一五九二六*三.0三.一四一五九二六*三.0*三.0;八對程序中用雙撇號括起來的字符串內(nèi)的字符即使與宏名相同也不進行置換九宏定義是專門用于預處理命令的一個專用名詞它與定義變量的含義不同只作字符替換不分配內(nèi)存空間說明:
九.一.二帶參數(shù)的宏定義
作用:不是進行簡單的字符串替換還要進行參數(shù)替換
帶參數(shù)的宏定義一般形式為:#define
宏名參數(shù)表字符串字符串中包含在括弧中所指定的參數(shù)#define
Saba*b
area=S三二;程序中用三和二分別代替宏定義中的形式參數(shù)a和b用三*二代替S三二
因此賦值語句展開為:area=三*二例:對帶實參的宏如S三二則按#define命令行中指定的字符串從左到右進行置換若串中包含宏中的形參如a、b則將程序中相應(yīng)的實參可以是常量、變量或表達式代替形參如果宏定義中的字符串中的字符不是參數(shù)字符如a*b中的*號則保留這樣就形成了置換的字符串對帶參的宏定義是這樣展開置換的:#include<stdio.h>#definePI三.一四一五九二六#defineSrPI*r*rvoidmain{floataarea;a=三.六;area=Sa;printf"r=%f\narea=%f\n"aarea;}運行情況如下:r=三.六00000area=四0.七一五0三八例九.三使用帶參的宏
賦值語句“area=Sa;
”
經(jīng)宏展開后為:area=三.一四一五九二六*a*a;一對帶參數(shù)的宏展開只是將語句中的宏名后面括號內(nèi)的實參字符串代替#define
命令行中的形參二在宏定義時在宏名與帶參數(shù)的括弧之間不應(yīng)加空格否則將空格以后的字符都作為替代字符串的一部分說明:一函數(shù)調(diào)用時先求出實參表達式的值然后代入形參而使用帶參的宏只是進行簡單的字符替換二函數(shù)調(diào)用是在程序運行時處理的為形參分配臨時的內(nèi)存單元而宏展開則是在編譯前進行的在展開時并不分配內(nèi)存單元不進行值的傳遞處理也沒有“返回值”的概念三對函數(shù)中的實參和形參類型要求一致而宏名無類型它的參數(shù)也無類型只是一個符號代表展開時代入指定的字符串即可宏定義時字符串可以是任何類型的數(shù)據(jù)四調(diào)用函數(shù)只可得到一個返回值而用宏可以設(shè)法得到幾個結(jié)果帶參數(shù)的宏和函數(shù)的區(qū)別:#include<stdio.h>#definePI三.一四一五九二六#defineCIRCLERLSVL=二*PI*R;S=PI*R*R;V=四.0/三.0*PI*R*R*Rvoidmain{floatrlsv;scanf"%f"&r;CIRCLErlsv;printf"r=%六.二fl=%六.二fs=%六.二fv=%六.二f\n"rlsv;}例九.四通過宏展開得到若干個結(jié)果voidmain
{floatrlsv;scanf"%f"&r;
l=二*三.一四一五九二六*r;s=三.一五一五九二六*r*r;v=四.0/三/0*三.一四一五九二六*r*r*r;
printf"r=%六.二fl=%六.二fs=%六.二fv=%六.二f\n"rlsv;
}對宏進行預編譯展開后的main函數(shù)如下:運行情況如下:三.五↙r=三.五0l=二一.九九s=三八.四八v=一七九.五九五使用宏次數(shù)多時宏展開后源程序長因為每展開一次都使程序增長而函數(shù)調(diào)用不會使源程序變長六宏替換不占運行時間只占編譯時間而函數(shù)調(diào)用則占運行時間分配單元、保留現(xiàn)場、值傳遞、返回帶參數(shù)的宏和函數(shù)的區(qū)別:
如果善于利用宏定義可以實現(xiàn)程序的簡化如事先將程序中的“輸出格式”定義好以減少在輸出語句中每次都要寫出具體的輸出格式的麻煩例九.五通過宏展開得到若干個結(jié)果#include<stdio.h>#definePRprintf#defineNL"\n"#defineD"%d"#defineD一DNL#defineD二DDNL#defineD三DDDNL#defineD四DDDDNL#defineS"%s"voidmain{intabcd;charstring[]="CHINA";a=一;b=二;c=三;d=四;PRD一a;PRD二ab;PRD三abc;PRD四abcd;PRSstring;}運行時輸出結(jié)果:一一二一二三一二三四CHINA所謂“文件包含”處理是指一個源文件可以將另外一個源文件的全部內(nèi)容包含進來C語言提供了#include命令用來實現(xiàn)“文件包含”的操作其一般形式為:#include"文件名"或#include<文件名>
九.二“文件包含”處理例九.六將例九.五時格式宏做成頭文件把它包含在用戶程序中一將格式宏做成頭文件format.h
#include<stdio.h>#definePRprintf#defineNL"\n"#defineD"%d"#defineD一DNL#defineD二DDNL#defineD三DDDNL#defineD四DDDDNL#defineS"%s"二主文件#include<stdio.h>#include"format.h"voidmain{intabcd;charstring[]="CHINA";a=一;b=二;c=三;d=四;PRD一a;PRD二ab;PRD三abc;PRD四abcd;PRSstring;}注意:
在編譯時并不是分別對兩個文件分別進行編譯然后再將它們的目標程序連接的而是在經(jīng)過編譯預處理后將頭文件format.h包含到主文件中得到一個新的源程序然后對這個文件進行編譯得到一個目標.obj文件被包含的文件成為新的源文件的一部分而單獨生成目標文件一一個#include命令只能指定一個被包含文件如果要包含n個文件要用n個#include命令二如果文件一包含文件二而在文件二中要用到文件三的內(nèi)容則可在文件一中用兩個include命令分別包含文件二和文件三而且文件三應(yīng)出現(xiàn)在文件二之前即在中定義三在一個被包含文件中又可以包含另一個被包含文件即文件包含是可以嵌套的說明:四在#include命令中文件名可以用雙撇號或尖括號括起來五被包含文件與其所在的文件即用#include命令的源文件在預編譯后已成為同一個文件而不是兩個文件因此如果中有全局靜態(tài)變量它也在文件中有效不必用extern聲明說明:
九.三條件編譯概念:所謂“條件編譯”是對部分內(nèi)容指定編譯的條件使其只在滿足一定條件才進行編譯條件編譯命令的幾種形式:一#ifdef標識符程序段一#else
程序段二#endif二#ifndef標識符程序段一#else
程序段二#endif三#if表達式程序段一#else
程序段二#endif例九.七輸入一行字母字符根據(jù)需要設(shè)置條件編譯使之能將字母全改為大寫輸出或全改為小寫字母輸出#include<stdio.h>#defineLETTER一voidmain{charstr[二0]="CLanguage"
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于群體智能算法求解柔性作業(yè)車間調(diào)度問題研究
- 保險公司團隊管理課件
- 我的擔憂大班健康教案
- 健康飲食:水果與牛肉的科學搭配
- 休克病人的護理
- 畢業(yè)包裝設(shè)計
- 小班美術(shù)拓印課件
- 保護視力宣傳月講座課件
- TYK2-ligand-2-生命科學試劑-MCE
- 交通設(shè)備制造業(yè)數(shù)字化轉(zhuǎn)型中的智能制造裝備創(chuàng)新應(yīng)用報告
- 2025至2030中國鐵路貨車行業(yè)深度調(diào)研及投資前景報告
- 浙里貸(數(shù)字貸款)復習試題附答案
- 2025年中國冷鐓鋼線行業(yè)市場發(fā)展前景及發(fā)展趨勢與投資戰(zhàn)略研究報告
- 山東檔案職稱考試《檔案基礎(chǔ)理論》完整題(附答案)
- 2025年食品安全管理考試試題及答案
- 2025年 吉林省長白山公安局警務(wù)輔助人員招聘考試試卷附答案
- 2025年公共衛(wèi)生管理考試試卷與答案
- 2025至2030空調(diào)行業(yè)市場發(fā)展現(xiàn)狀及競爭格局與投資價值報告
- 冠心病介入治療術(shù)
- 2025至2030中國環(huán)氧活性稀釋劑市場未來趨勢及前景規(guī)劃建議報告
- (新版)水利水電安全員考試題庫及答案(含各題型)
評論
0/150
提交評論