C語(yǔ)言的預(yù)處理命令有哪些?_第1頁(yè)
C語(yǔ)言的預(yù)處理命令有哪些?_第2頁(yè)
C語(yǔ)言的預(yù)處理命令有哪些?_第3頁(yè)
C語(yǔ)言的預(yù)處理命令有哪些?_第4頁(yè)
C語(yǔ)言的預(yù)處理命令有哪些?_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余3頁(yè)可下載查看

下載本文檔

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

文檔簡(jiǎn)介

1、精選文庫(kù)問(wèn):關(guān)于 C 語(yǔ)言中的預(yù)處理命令? 答:我們可以在 C 源程序中插入傳給 編譯程序 的各種指令,這些指令被稱為 預(yù)處理器指令(等價(jià)于 匯編語(yǔ)言中的偽指令 ),它們擴(kuò)充了程序設(shè)計(jì)的環(huán)境?,F(xiàn)把常用的 預(yù)處理命令 總結(jié)如下:1. 預(yù)處理程序按照 ANSI 標(biāo)準(zhǔn)的定義,預(yù)處理程序應(yīng)該處理以下 12 條指令:#if 、#ifdef 、#ifndef、#else、#elif 、#endif、#define、#undef、#line、#error、#pragma、 #include。顯然,所有的 12 個(gè)預(yù)處理指令都以符號(hào) #開(kāi)始,每條預(yù)處理指令 必須獨(dú)占一行 。2. #define#define

2、指令定義一個(gè) 標(biāo)識(shí)符 和一個(gè)串(也就是 字符集 ),在源程序 中發(fā)現(xiàn)該 標(biāo)識(shí)符時(shí),都用該 串替換之( 原樣替換,不要附加任何人為理解上的符號(hào) )。這種 標(biāo)識(shí)符 稱為宏名字,相應(yīng)的替換稱為 宏代換。一般形式如下:#define macro-name char-sequence這種語(yǔ)句 不用分號(hào)結(jié)尾 。宏名字和串之間可以有多個(gè)空格符,但 串開(kāi)始后只能以新行終止 。 在 C 語(yǔ)言里宏定義只用來(lái)做的宏名替換, 而不做語(yǔ)法檢查的 ,因而它不是 C 語(yǔ)句, 所以宏定義的 語(yǔ)句結(jié)尾不需要加分號(hào)。宏也在 C里也叫 預(yù)處理命令 ,因?yàn)楹晔窃?程序編譯 前先進(jìn)行字符替換的,所以叫預(yù)處理 . 例如:我們使用 LEF

3、T 代表 1,用 RIGHT 代表 0,我們使用兩個(gè) #define 指令:#define LEFT 1#define RIGHT 0每當(dāng)在 源程序中遇到 LEFT 或 RIGHT 時(shí),編譯程序 都用 1或 0替換。 定義一個(gè)宏名字之后,可以在其他 宏定義 中使用 ,例如:#define ONE 1#define TWO ONE+ONE#define THREE ONE+TWO 宏代換就是用相關(guān)的串替代標(biāo)識(shí)符。因此,如果希望定義一條標(biāo)準(zhǔn)錯(cuò)誤信息時(shí),可以如下定義:#define ERROR_MS “ Standard error on inpunt ” 如果一個(gè)串長(zhǎng)于一行,可在行尾用反斜線 ”續(xù)

4、行,如下:#define LONG_STRING “ This is a very very longstring that is used as an example”3. #error#error 指令強(qiáng)制 編譯程序 停止編譯,它主要用于程序調(diào)試(放在錯(cuò)誤的分支中,一旦進(jìn)入錯(cuò)誤 的分支就顯示該信息) 。#error 指令的一般形式是:#error error-message注意,宏串 error-message 不用雙引號(hào)包圍。遇到 #error 指令時(shí),錯(cuò)誤信息被顯示,可能同時(shí)還 顯示編譯程序作者預(yù)先定義的其他內(nèi)容。4. #include程序中的 #include 指令要求編譯程序讀入另

5、一個(gè)源文件。被讀入文件的名字必須用雙引號(hào) ( “”或) 一對(duì)尖括號(hào) (<>) 包圍,例如:#include “ stdio.h ”#include <stdio.h>都使 C編譯程序讀入并編譯 頭文件 以用于 I/O系統(tǒng)庫(kù)函數(shù)。包含文件中可以包含其他 #include 指令,稱為嵌套包含。允許的最大嵌套深度隨編譯器而變。 文件名被雙括號(hào)或尖括號(hào)包圍決定了對(duì)指定文件的搜索方式。 文件名被尖括號(hào)包圍時(shí),搜索按編譯 程序作者的定義進(jìn)行, 一般用于搜索某些專門放置包含文件的特殊目錄。 當(dāng)文件名被雙引號(hào)包圍時(shí), 搜索按編譯程序?qū)崟r(shí)的規(guī)定進(jìn)行,一般搜索當(dāng)前目錄。 如未發(fā)現(xiàn),再按尖括

6、號(hào)包圍時(shí)的辦法重新搜 索一次。通常,絕大多數(shù)程序員使 用尖括號(hào)包圍標(biāo)準(zhǔn)的頭文件 , 雙引號(hào)用于包圍與當(dāng)前程序相關(guān)的文件 名。5. 條件編譯 指令 若干編譯指令允許程序員有選擇的編譯程序源代碼的不同部分,這種過(guò)程稱為 條件編譯 。5.1 #if 、 #else、 #elif #endif條件編譯 指令中最常用的或許是 #if ,#else, #elif 和#endif 。這些指令允許程序員根據(jù)常數(shù)表達(dá) 式的結(jié)果有條件地啟用(包圍)部分代碼。#if 的一般形式是:#if constant-expression Statement sequence#endif如 #if 后的常數(shù)表達(dá)式為真,則 #i

7、f 和 #endif 中間的代碼被編譯,否則忽略該代碼段。 #endif 標(biāo)記 #if 塊的結(jié)束。#else 指令的作用與 C 語(yǔ)言的 else 相似, #if 指令失敗時(shí)它可以作為備選指令。例如:#include <stdio.h>#define MAX 100Int main(void)#if MAX>99printf( “ Compiled for array greater than 9n” );#elseprintf( “ Complied for small arrany”. );#endifreturn 0;3精選文庫(kù)注意, #else 既是標(biāo)記 #if 塊的結(jié)

8、束, 也標(biāo)記 #else 塊的開(kāi)始。 因?yàn)槊總€(gè) #if 只能寫一個(gè) #endif 匹配。 #elif 指令的意思是 “否則,如果 ”,為多重編譯選擇建立一條if-else-if (如果 -否則-如果鏈)。如果 #if表達(dá)式為真,該代碼塊被編譯,不測(cè)試其他 #elif 表達(dá)式。否則,序列中的下一塊被測(cè)試,如果成功 則編譯之。一般形式如下:#if expression 1Statement sequence 1#elif expression 2Statement sequence 2#elif expression 3Statement sequence 3#elif expression nS

9、tatement sequence n#endif5.2 #ifdef 和 #ifndef條件編譯的另一個(gè)方法是使用編譯指令#ifdef 和#ifndef ,分別表示“如果已定義”和“如果未定義”。 #ifdef 的一般形式如下:#ifdef macro-nameStatement sequence#endif如果 macro-name 原先已經(jīng)被一個(gè) #define 語(yǔ)句定義,則編譯其中的代碼塊。#ifndef 的一般形式是:#ifndef macro-nameStatement sequence#endif如果 macro-name 當(dāng)前未被 #define 語(yǔ)句定義,則編譯其中的代碼塊。

10、 我認(rèn)為,用這種方法可以很方便的開(kāi)啟/關(guān)閉整個(gè)程序的某項(xiàng)特定功能。?#ifdef 和#ifndef 都可以使用 #else 或#elif 語(yǔ)句。#inlucde <stdio.h>#define T 10Int main(void)#ifdef tPrintf( “ Hni ”T );#elsePrintf( “ Hi anyonn”e );#endif #ifndef MPrintf( “ M Not Definned” );#endifReturn 0;6. #undef#undef 指令刪除前面定義的宏名字。也就是說(shuō),它的意思是“不要已定義的某個(gè)宏” 。一般形式 為:#und

11、ef macro-name7. 使用 defined除 #ifdef 之外, 還有另外一種確定是否定義宏名字的方法,即可以將 #if 指令與 defined 編譯時(shí)操作符 一起使用。 defined 操作符的一般形式如下:defined macro-name如果 macro-name 是當(dāng)前定義的,則表達(dá)式為真,否則為假。例如,確定宏 MY 是否定義,可以使用下列兩種 預(yù)處理命令 之一:#if defined MY或#ifdef MY也可以在 defined 之前加上 感嘆號(hào) ”!來(lái)”反轉(zhuǎn)相應(yīng)的條件 。例如, 只有在 DEBUG 未定義的情況下 才編譯。#if !defined DEBUGPr

12、intf( “ Final Versionn”! );#endif使用 defined 的一個(gè)原因是,它允許由 #elif 語(yǔ)句確定的宏名字存在。?8. #line#line 指令改變 _LINE_ 和_FILE_的內(nèi)容。 _LINE_ 和_FILE_都是編譯程序中預(yù)定義的標(biāo) 識(shí)符(見(jiàn) 11)。標(biāo)識(shí)符 _LINE_ 的內(nèi)容是當(dāng)前被編譯代碼行的行號(hào), _FILE_ 的內(nèi)容是當(dāng)前被編譯 源文件的文件名。 #line 的一般形式是:#line number “ filename ”其中, number 是正整數(shù)并變成 _LINE_ 的新值;可選的 “filename 是”合法文件標(biāo)識(shí)符并變成 _FI

13、LE_ 的新值。 #line 主要用于調(diào)試和特殊應(yīng)用。9. #pragma#pragma 是 編譯程序?qū)崿F(xiàn)時(shí)定義 的指令,它允許由此向編譯程序傳入各種指令。例如,一個(gè)編 譯程序可能具有支持跟蹤程序執(zhí)行的選項(xiàng),此時(shí)可以用 #pragma 語(yǔ)句選擇該功能。編譯程序忽略其 不支持的 #pragma 選項(xiàng)。 #pragma 提高 C 源程序?qū)幾g程序的可移植性。10. 預(yù)處理操作符 #和 # 有兩個(gè)預(yù)處理操作符: #和 #,它們可以在 #define 中使用。操作符 #通常稱為字符串化的操作符,它把其后的串變成用雙引號(hào)包圍的串。例如:#include <stdio.h>#define mk

14、str(s) #sint main(void)Printf(mkstr(I like C);Return 0; 預(yù)處理程序把以下的語(yǔ)句: Printf(mkstr(I like C); 變成Printf( “I like C ”);操作符 #把兩個(gè)標(biāo)記拼在一起,形成一個(gè)新標(biāo)記。例如:#include <stdio.h>#define concat(a,a) a#bint main(void)Int xy = 10;Printf( “ %d” ,concat(x,y);Return 0;預(yù)處理程序把以下語(yǔ)句:Printf( “ %d” ,concat(x,y);變成Printf( “

15、 %d” ,xy);操作符 #和 #主要作用是允許預(yù)處理程序?qū)Ω赌承┨厥馇闆r,多數(shù)程序中并不需要。11. 預(yù)定義宏C 規(guī)范了 5 個(gè)固有的預(yù)定義宏,它們是:_LINE_ :正在編譯的程序的行號(hào)_FILE_ :正在編譯的程序的文件名_DATE_ :代表源文件翻譯成目標(biāo)碼的日期,形如month/day/year(月 / 日/年 )_TIME_ :代表源代碼編譯成目標(biāo)碼的時(shí)間,形如hour:minute:second( 時(shí):分:秒 )_STDC_ :如果_STDC_的內(nèi)容是 十進(jìn)制常數(shù) 1,則表示編譯程序的實(shí)現(xiàn)符合標(biāo)準(zhǔn)C。問(wèn):在程序的一行上可以出現(xiàn)多個(gè)有效的預(yù)處理命令行。預(yù)處理命令可以出現(xiàn)在函 數(shù)的

16、內(nèi)部。給出的兩段代碼,有一段是錯(cuò)誤的,哪段?答:第 1 段有問(wèn)題。#ifndef WIN32#endif printf("OKn");在這里,這個(gè) printf 就不會(huì)被執(zhí)行。也就是說(shuō), 一行中, 只能有一條 預(yù)處理指 令,當(dāng)編譯的預(yù)處理階段, 編譯器識(shí)別了一條完整的 預(yù)處理指令 后,后面的所有東西 他都不要了。對(duì)于第二段,在函數(shù)里,我們是可以使用 預(yù)處理指令 的。比如:void fun(void)#ifdef WIN32. / 對(duì)于 windows 系統(tǒng)環(huán)境的操作#else. / 對(duì)于 windows 以外的系統(tǒng)環(huán)境的操作#endif /* WIN32 */問(wèn):兩個(gè) C語(yǔ)

17、言的小問(wèn)題 ( 預(yù)處理命令 )1 #define abc(x,y) (x)<(y)?(x):(y)main() int a=10,b=15,c; c=10*abc(a,b); printf("%d",c); 我算出結(jié)果是 100,可參考答案是 15,不知是為什么 ? 2 #define A 5.5#define B(x) A*x*xmain() int a=1,b=2; printf("%f",B(a+b); 這個(gè)答案是 9.5 ,這又是為何 ?答:1. c = 10*abc(a,b)= 10 * (x)<(y)?(x):(y)= 10 *

18、10 < 15 ? 10 : 15= 100 < 15 ? 10 : 15= 152. B(a+b) = A * a+b * a+b= 5.5 * 1 + 2 * 1 + 2= 5.5 + 2 + 2= 9.5問(wèn): C語(yǔ)言預(yù)處理命令 #define 選擇題:以下程序的運(yùn)行結(jié)果是? #define MAX(A,B) (A)>(B)?(A):(B) #define PRINT(Y) printf(“Y=%dt” ,Y)main()int a=1,b=2,c=3,d=4,t; t=MAX(a+b,c+d);PRINT(t);A )Y=3 B )存在語(yǔ)法錯(cuò)誤 C)Y=7 D)Y=0 請(qǐng)給我解釋下 PRINT(t); 在宏展開(kāi)是怎么表示的,答案是 C。答:宏處理的時(shí)候,一定要記?。褐苯哟M(jìn)去,任何多余的動(dòng)作都不能有(別想當(dāng) 然地加括號(hào)!)。還有記住一點(diǎn)的是在 printf"" 雙括號(hào)里的是不能替代的話, 所以這里的 Y是輸出形 式。而不是字符 常量 Y 的替代。這是一種特殊規(guī)定。PRINT(t)=printf("Y=%dt",t); 所以結(jié)果必將是 Y=(一個(gè)值) 又因?yàn)镸AX(a+b,c+d)(a+b)>(c+d)?(a+b):(c+d) 的結(jié)果是 7,所以,答案是“ C) Y=7”。問(wèn):求解:關(guān)于 c

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論