C語言學習——預處理命令

1.預處理命令簡介
C語言程序以#開頭,以換行符結尾的行稱爲預處理指令,其包括:
1)宏定義:#define #undef
2)文件包括:#include
3)條件編譯:#if #ifdef #else #elif #endif
4)其他:#line #error #pragam

2.宏定義
1)分類:帶參數的宏定義,不帶參數的宏定義
2)不帶參數宏定義:
1形式:#define 標識符(宏名) 單詞串(宏體),末尾不用加“;”
2作用:將程序中出現標識符替換爲宏體
3注意:
a. 一般宏名用大寫字母表示,容易被發現在程序中哪個位置發生替換
b. 當單詞串過長時,末尾可以加 “\”即:使用反斜線續行符,例如:
#define LONG_STRING "this is a very long string that is\
used as an example"
c. 宏名的作用域爲:從其定義處開始到其所在文件的結束處,不一定在main函數中
d. 宏定義可以嵌套定義,例如:
#define R 2.0
#define L 2*R,此爲正確。
e.但是不可以遞歸定義,如接上面:#define R 2.0+R
程序中字符串常量即雙引號中的字符,不作爲宏進行宏替換操作,如:
#define XYZ 2.0
printf("XYZ"),此時輸出的是XYZ,而不是2.0
f. 宏可以被重複定義
#define N 10
結束;
#define N 20
結束;
g. 在宏定義中,如果單詞串是個表達式,那麼一定要用括號括起來
h.#define TM_B 是個標準正確的宏定義
3)帶參數宏定義:
1形式:#define 標識符(參數列表) 單詞串
標識符是宏名,一般也用大寫字母表示
參數表有一個或多個參數構成,參數只有參數名,沒有數據類型符,參數之間用逗號隔開
單詞串是宏的內容文本,通常引用宏的參數
2預編譯過程:
首先將宏內容文本中的宏參數換成實參文本,這樣形成了宏的實際內容文本,再將這個宏的實際內容文本替換源程序中的宏標識符。
3注意:宏名與圓括號之間不能有空白符,否則就會變成定義一個不帶參數的宏,而要替換的內容是空白符之後所有的字符。
在宏替換中,替換文本中如果出現預處理器運算符##,則該參數將被實參替換且##與前後空白符將被刪除,如:
#define paste(front,back) front ## back。
由於參數的宏在使用時,參數大多是表達式,宏內容本身也是表達式,因此,不但需要將整個宏括起來,還要講宏參數括起來,否則有意想不到的結果,如:
#define SORT(x) x*x
3.文件包含
1)形式 #include <> 或者 #include “包含文件名”
2)兩種表示的區別:
<>:直接到系統指定的“文件包含目錄”去查找被包含的文件。
“”:系統首先到當前目錄下查找被還包含文件,如果沒找到,再到系統中指定的“文件包含目錄”去查找
3)注意:
文件包含可以嵌套,即被包含文件中有包含另一個文件。

4.條件編譯
1)定義及作用:根據一定條件去編譯源文件的不同部分,這就是條件編譯。
條件編譯使得統一源程序在不同的編譯條件下得到不同的目標代碼。
2)#if.....#endif形式:
a.格式:#if 條件1 (條件必須爲常量表達式,通常會用到宏名,條件可以不加括號)
程序段1
#elif 條件2 (可以沒有
程序段2
...
#else (可以沒有
程序段n
#endif(必須存在)
3)#ifdef....#endif形式:
a.格式:#ifdef 宏名 (含義:是否定義了宏名)
程序段1
#else 宏名
程序段n
#endif
4)#ifndef...#endif
a.格式:#ifndef 宏名 (含義:如果沒有被宏定義)
程序段1
#else
程序段2
#endif
5)注意:
條件編譯與分支語句不一樣:條件編譯是程序運行前的預處理
分支語句是程序運行時的處理
條件編譯的條件必須是常量表達式,如:
#define N 10
int NUM=10;
#if NUM==10 (這裏是錯誤的,NUM是變量,不是常量表達式)
...
條件編譯命令可以放在所有函數的外部,也可以放在函數內部
6)好處:
條件編譯解決了一個程序放在不同環境運行編譯的問題,例如,列出所有條件,在不同環境中只需要在程序開頭打上#define ... 則可以在這個環境中使用

7)總結:
a.宏定義時末尾不加分號
b.宏擴展的整體和參數一般用括號括起來。
c.在用宏來定義字符串常量時,沒有用引號。
d.條件編譯的條件必須是常量。






































發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章