預處理
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...