C語言基礎 預處理

2021-06-28 21:30:23 字數 2181 閱讀 9382

預處理

1.c語言在對源程式進行編譯之前,會先對一些特殊的預處理指令作解釋(比如之前使用的#include檔案包含指令),產生乙個新的源程式(這個過程稱為編譯預處理),之後再進行通常的編譯

2.為了區分預處理指令和一般的c語句,所有預處理指令都以符號"#"開頭,並且結尾不用分號

3.預處理指令可以出現在程式的任何位置,它的作用範圍是從它出現的位置到檔案尾。習慣上我們盡可能將預處理指令寫在源程式開頭,這種情況下,它的作用範圍就是整個源程式檔案

4.c語言提供的預處理指令主要有:巨集定義、

條件編譯、

檔案包含

4.預處理指令在**翻譯成0和1之前執行

5.預處理的位置是隨便寫的

6.預處理指令的作用域:從編寫指令的那一行開始,一直到檔案結尾,可以用#undef取消巨集定義的作用

7.巨集名一般用大寫或者以k開頭,變數名一般用小寫

不帶引數的巨集定義

1.一般形式

#define 巨集名 字串

比如#define abc 10

右邊的字串也可以省略,比如#define abc

2.作用

它的作用是在編譯預處理時,將源程式中所有"巨集名"替換成右邊的"字串",常用來定義常量。

3.使用習慣與注意

1> 巨集名一般用大寫字母,以便與變數名區別開來,但用小寫也沒有語法錯誤

2> 對程式中用雙引號擴起來的字串內的字元,不進行巨集的替換操作。

3> 在編譯預處理用字串替換巨集名時,不作語法檢查,只是簡單的字串替換。只有在編譯的時候才對已經展開巨集名的源程式進行語法檢查

4> 巨集名的有效範圍是從定義位置到檔案結束。如果需要終止巨集定義的作用域,可以用#undef命令

5> 定義乙個巨集時可以引用已經定義的巨集名

#include //#define kcount 4

int main()

;

for ( int i = 0; i

帶引數的巨集定義

1.一般形式

#define 巨集名(引數列表) 字串

2.作用

在編譯預處理時,將源程式中所有巨集名替換成字串,並且將 字串中的引數 用 巨集名右邊引數列表 中的引數替換

3.使用注意

1> 巨集名和引數列表之間不能有空格,否則空格後面的所有字串都作為替換的字串

2> 帶引數的巨集在展開時,只作簡單的字元和引數的替換,不進行任何計算操作。所以在定義巨集時,一般用乙個小括號括住字串的引數。

int sum(int a, int b)

*/#include #define sum(v1, v2) ((v1)+(v2))

#define pingfang(a) ((a)*(a))

int main()

與函式的區別

從整個使用過程可以發現,帶引數的巨集定義,在源程式中出現的形式與函式很像。但是兩者是有本質區別的:

1> 巨集定義不涉及儲存空間的分配、引數型別匹配、引數傳遞、返回值問題

2> 函式呼叫在程式執行時執行,而巨集替換只在編譯預處理階段進行。所以帶引數的巨集比函式具有更高的執行效率

條件編譯

在很多情況下,我們希望程式的其中一部分**只有在滿足一定條件時才進行編譯,否則不參與編譯(只有參與編譯的**最終才能被執行),這就是條件編譯。

基本用法

1 #if 條件1

2 ...code1...

3 #elif 條件2

4 ...code2...

5 #else

6 ...code3...

7 #endif

1> 如果條件1成立,那麼編譯器就會把#if 與 #elif之間的code1**編譯進去(注意:是編譯進去,不是執行,很平時用的if-else是不一樣的)

2> 如果條件1不成立、條件2成立,那麼編譯器就會把#elif 與 #else之間的code2**編譯進去

3> 如果條件1、2都不成立,那麼編譯器就會把#else 與 #endif之間的code3編譯進去

4> 注意,條件編譯結束後,要在最後麵加乙個#endif,不然後果很嚴重(自己思考一下後果)

5> #if 和 #elif後面的條件一般是判斷巨集定義而不是判斷變數,因為條件編譯是在編譯之前做的判斷,巨集定義也是編譯之前定義的,而變數是在執行時才產生的、才有使用的意義

C語言基礎 預處理

預處理 預處理命令是由ansi c統一規定的,但是它們不是c語言本身的組成部分,不能直接對它們進行編譯 因為編譯程式不能識別它們 必須在對程式進行通常的編譯 包括詞法和語法分析 生成 優化等 之前,先對程式中這些特殊的命令進行 預處理 即根據預處理命令對程式作相應的處理 例如,若程式中用 defin...

C語言基礎 預處理指令

在編譯前進行解析處理的指令 源 編譯預處理 編譯 鏈結 執行 編譯預處理指令 1.巨集定義 define 1.1 不帶引數的巨集定義 1.2 帶引數的巨集定義 2.條件編譯 3.檔案包含 include 編譯預處理指令 1.所有的編譯預處理指令都是以 號開頭 2.所有的編譯預處理指令都不需要分號 巨...

C語言基礎(十) 預處理

預處理就是在編譯之前所做的事情,所以也叫預編譯,主要有巨集定義 檔案包含處理和條件編譯。巨集定義指令是指用乙個指定的識別符號代表乙個字串,可以減少程式中重複書寫某些字串的工作量,使用巨集可以達到 一改全改 的 規範。巨集定義主要分為不帶引數的巨集定義 和 帶引數的巨集定義。不帶引數的巨集定義 def...