第8章編譯預處理_第1頁
第8章編譯預處理_第2頁
第8章編譯預處理_第3頁
第8章編譯預處理_第4頁
第8章編譯預處理_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第8章編譯預處理本章教學目標:理解include命令的含義,熟練掌握include命令的用法;掌握#宏定義#define命令的使用;了解條件編譯的各種形式和意義。第8章編譯預處理8.1文件包含#include命令8.2宏定義#define命令8.3條件編譯

8.1文件包含#include命令文件包含由#include命令來說明。編譯預處理時,系統(tǒng)將包含文件的內(nèi)容插入到程序中引用它的地方,即程序中相應的#include命令所在處,如下圖8-1所示:圖8-1#include命令

文件包含的一般形式為:#include<文件名>和#include“文件名”例如,#include“math.h”特別注意(1)每行寫一句,只能寫一個文件名,結(jié)尾不加分號“;”。被包含的文件必須是源文件而不能是目標文件。文件名可以任意,但通常以“h”(head的第一個字母)為后綴,因為被包含文件通常在包含文件的頭部,被包含文件也因此而被稱為“頭文件”。(2)文件包含可以嵌套,即在一個被包含的文件中可以包含另一個被包含文件,但要注意避免重復包含和重復定義問題,采用的方法是條件編譯。(3)當一個文件中有多條include命令將自己編寫的文件包含進來時,應注意它們的先后次序。比如,如果文件A包含文件B和文件C,而文件B要用到文件C中的內(nèi)容,那么,在文件A中應將#include“C”寫在#include“B”的前面。(4)在include命令中,文件名可以用尖括號或雙引號括起來,二者都是合法的,其區(qū)別是用尖括弧時,系統(tǒng)到存放C庫函數(shù)頭文件所在的目錄中去尋找要包含的文件。用雙引號時,系統(tǒng)先在用戶當前目錄中尋找要包含的文件,若找不到,再按標準方式查找。8.2宏定義#define命令

使用#define命令指定一個標識符(即名字)來代表一個字符串。宏定義分為不帶參數(shù)和帶參數(shù)兩種。8.2.1不帶參數(shù)的宏定義不帶參數(shù)的宏定義是指用一個指定的標識符(宏名)來代表一個常量(宏體)。其一般格式為:#define<標識符><字符串>其含義是將程序中該命令以后出現(xiàn)<標識符>的地方均用<字符串>來替代。其中標識符習慣上用大寫字母表示?!纠?.1】不帶參數(shù)的宏定義的應用。#definePI3.1415926main(){floatr,circle,area;

printf(“\nPleaseinputradius:“);

scanf(“%f”,&r);circle=2*PI*r;area=PI*r*r;

printf(“\ncircle=%farea=%f”,circle,area);}

說明在程序中使用宏定義可以提高程序的易讀性和通用性,便于程序的修改、調(diào)試和移植。使用中應注意下面幾點:(1)習慣上宏名一般用大寫字母表示;(2)宏定義不是C語句,書寫時行末不應加分號;(3)在進行宏定義時,可以引用已定義的宏名;(4)當宏體是表達式時,為穩(wěn)妥起見常將它用括弧括起來;(5)若宏名字出現(xiàn)在字符串內(nèi),則預處理時它將不被宏替換;(6)若宏名字出現(xiàn)在標識符內(nèi),則預處理時它也不被替換;(7)同一個宏名可以重復定義,如果不一致,編譯時會發(fā)出警告,并以最后一次定義為準。(8)當宏定義在一行中寫不下時,可在行尾用反斜杠“\”進行續(xù)行。(9)宏定義通常放在源程序文件的開頭,其作用域是整個源程序。也可以在函數(shù)內(nèi)部作宏定義,這時宏名字的作用域只在本函數(shù)??捎?undef終止宏定義的作用域:(10)與變量定義不同,宏定義只作字符替換,不分配內(nèi)存空間,也不做正確性檢查。(11)宏定義時可以不包含宏體,即寫成:#define宏名此時僅說明宏名已被定義。8.2.2帶參數(shù)的宏定義帶參數(shù)的宏更具靈活性。定義的一般形式為:#define宏名(參數(shù)表)宏體例#defineRECT(A,B)A*B宏替換時,當實參取不同值時,宏將取得不同的值,這是使用帶參數(shù)宏定義的優(yōu)點。對于帶參數(shù)的宏定義,使用中應注意以下問題:(1)定義帶參數(shù)的宏時,宏體中一般應含有參數(shù)。另外,宏名與圓括弧之間不應留有空格;(2)為了保證宏展開的正確性,通常宏體中的參數(shù)以及宏體本身都用圓括弧擴起來;(3)ANSIC提供了兩個預處理操作符:#和##。這兩個操作符用于宏體中。#操作符使跟在它后面的實參轉(zhuǎn)換為帶引號的字符串。##操作符用于連接兩個符號。(4)帶參的宏與函數(shù)很相似,當兩者是有著本質(zhì)上的區(qū)別的。【例8.2】使用宏得到多個結(jié)果。#definePI3.1415926#defineSPHERE(R,C,S,V)C=2*PI*R;S=4*PI*R*R;V=4.0/3*PI*R*R*Rvoidmain(){floatr,c,s,v;printf("InputtheSphere'sradius:");scanf("%f",&r); SPHERE(r,c,s,v);

printf("r=%f,c=%f,s=%f,v=%f\n",r,c,s,v);}宏調(diào)用語句SPHERE(r,c,s,v);經(jīng)預編譯宏展開后變成為三條語句:c=2*3.1415926*r;s=4*3.1415926*r*r;v=4.0/3*3.1415926*r*r*r;程序的運行情況為:InputtheSphere'sradius:10r=10.000000,c=62.831852,s=1256.637085,v=4188.790133【例8.3】

從鍵盤輸入兩個整數(shù),并把其中較大的值顯示出來。要求用宏定義編程。#include“stdio.h”#defineMAX(a,b)((a)>(b)?(a):(b))main(){intx,y,z;printf(“InputTownumbers\n”);scanf(“%d%d”,&x,&y);z=MAX(x,y);printf(“Max=%d”,z);} 8.2.3終止宏定義

宏命令#undef用于終止宏定義的作用域。一般形式為: #undef宏名例如: #defineMULT(x,y)((x)*(y)) main() { ┅ } #undefMULT(x,y) function() { ┅ }由于在函數(shù)function()之后,使用#undef終止宏名MULT(x,y)的作用,在函數(shù)function()中MULT(x,y)不再起作用。#undef也可用于函數(shù)內(nèi)部。

8.3條件編譯

為了便于程序調(diào)試和移植等,C語言提供了“條件編譯”預處理命令,這些命令可以控制編譯程序?qū)υ创a進行有條件的,編譯。條件編譯有以下幾種命令形式:形式一:#if表達式程序段1#else

程序段2#endif形式二:#if表達式1程序段1#elif表達式2程序段2#elif表達式3程序段3

#else

程序段n#endif

形式三:#ifdef宏名程序段1#else

程序段2#endif形式四:#ifndef

宏名程序段1#else

程序段2#endif形式五:

#ifdefined(宏名)程序段1#else

程序段2#endif

例如,在alloc.h文件中,可以看到以下關(guān)于NULL的定義,其目的是適合不同編譯模式的兼容性。

#ifndefNULL#ifdefined(__TINY__)||defined(__SMALL__)||defined(__MEDIUM__)#defineNULL 0#else#defineNULL 0L#endif#endif【例8.4】

輸入一個口令,根據(jù)需要設(shè)置條件編譯,使之在調(diào)試程序時,按原碼輸出;在使用時輸出“*”號。#defineDEBUGvoidmain(void){charpass[80];int=-1;printf(

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論