1.預處理概念:編譯程序時,編譯器將對程序文件作至少兩個階段的編譯預處理,預處理程序預處理階段和編譯程序預處理階段。
- 預處理程序預處理階段:C預處理程序先於C編譯程序運行。預處理程序從前向后根據預處理命令做相應的處理。預處理命令分為三類:
①文件包含命令
②宏定義命令
③條件編譯命令
- 編譯程序預處理階段:
①將注釋替換為空格字符
②將續行符連接的物理行合並成邏輯行
③將僅用空白字符分隔的多個字符串直接連接
2.文件包含命令:在預處理程序文件時,遇到包含文件預處理命令行,都用filename文件中的全部內容替代這一行,使其成為程序文件的一部分參與編譯。雙引號包含的文件名優先在程序文件所在的目錄查找,如果找不到,再從C編譯系統指定的目錄中查找。
#inlcude <filename.h> #include "filname.h"
3.宏定義命令:指用一個標識符來代替一個字符序列。有兩種宏形式:類對象宏(object-like macro)定義與類函數宏(function-like macro)定義。前者時不帶參數的宏定義形式,后者時帶參數的宏定義形式。帶參數宏定義中宏名和左括號之間不能有空格,右括號和宏主體之間至少有一個空格。僅有括號(沒有宏參數)是允許的。
#define 宏名(宏參數1, 宏參數2, ...) 宏主體
- 調用形式:宏名(替換參數1, 替換參數2,...),宏參數與替換參數只有參數個數和順序的對應關系,不存在類型一致性的問題。
#define MAX(A,B) ((A)>(B)?(A):(B)) ...... 源文件:x=MAX(p+q,r+s); 替換成:x=((p+q)>(r+s)?(p+q):(r+s)); ......
- 對於出現在宏主體中的宏名,宏展開時不做任何替換;但它之前定義的宏名出現在宏主體時,宏展開要實施替換。
- 包含在字符串直接常量和注釋中的宏調用形式不進行替換。
- 宏主體是由若干符號和符號的組合構成的,不能通過宏替換形成一個常數或標識符。
- 函數調用時,先求出實參的值然后傳給形參;宏調用僅替換不求值。
4.條件編譯命令:僅當指定條件為真時,#if控制結構包含的代碼才被編譯。主要的三種類型如下:
#ifdef 宏名 /*程序段1*/ #else /*程序段2*/ #endif
#ifndef 宏名 /*程序段1*/ #else /*程序段2*/ #endif
#if 表達式 /*程序段1*/ #elif 表達式 /*程序段2*/ #elif 表達式 /*程序段3*/ #else /*程序段4*/ #endif
