1. 程式人生 > >C語言中的三大預編譯功能

C語言中的三大預編譯功能

這三種預處理包括:巨集定義、檔案包含條件編譯

巨集定義是C語言提供的三種預處理功能的其中一種。巨集定義和操作符的區別是:巨集定義是替換,不做計算,也不做表示式求解。

巨集定義又稱為巨集代換、巨集替換,簡稱“巨集”。
格式: 其中的識別符號就是所謂的符號常量,也稱為“巨集名”。 預處理(預編譯)工作也叫做巨集展開:將巨集名替換為字串。 掌握"巨集"概念的關鍵是“換”。一切以換為前提、做任何事情之前先要換,準確理解之前就要“換”。 即在對相關命令或語句的含義和功能作具體分析之前就要換: : 把程式中出現的Pi全部換成3.1415926 說明: (1)巨集名一般用大寫 (2)使用巨集可提高程式的通用性和易讀性,減少不一致性,減少輸入錯誤和便於修改。例如:
陣列
大小常用巨集定義 (3)預處理是在編譯之前的處理,而編譯工作的任務之一就是語法檢查,預處理不做語法檢查。 (4)巨集定義末尾不加分號; (5)巨集定義寫在函式的花括號外邊,作用域為其後的程式,通常在檔案的最開頭。 (6)可以用#undef命令終止巨集定義的作用域 (7)巨集定義允許巢狀 (8)字串( " " )中永遠不包含巨集 (9)巨集定義不分配記憶體,變數定義分配記憶體。 (10)巨集定義不存在型別問題,它的引數也是無型別的。

帶引數

除了一般的字串替換,還要做引數代換 格式例如:#define S(a,b) a*b area=S(3,2);第一步被換為area=a*b; ,第二步被換為area=3*2; 類似於
函式呼叫
,有一個啞實結合的過程: (1)實參如果是表示式容易出問題 #define S(r) r*r area=S(a+b);第一步換為area=r*r;,第二步被換為area=a+b*a+b; 正確的巨集定義是#define S(r) ((r)*(r)) (2)巨集名和引數的括號間不能有空格 (3)巨集替換隻作替換,不做計算,不做表示式求解 (4)函式呼叫在編譯後程序執行時進行,並且分配記憶體。巨集替換在編譯前進行,不分配記憶體 (5)巨集的啞實結合不存在型別,也沒有型別轉換。 (6)巨集展開使源程式變長,函式呼叫不會 (7)巨集展開不佔執行時間,只佔編譯時間,函式呼叫佔執行時間(分配記憶體、保留現場、
值傳遞
返回值==========================檔案包含 在C語言中檔案包含是指一個原始檔可以將另一個原始檔的全部內容包含進來。 該命令的作用是在預編譯時,將指定原始檔的內容複製到當前檔案中。
檔案包含有兩種格式,分別是:#include "file" 和 #include <file> 這兩格式的區別在於: 1.使用雙引號,系統首先到當前目錄下查詢被包含的檔案,如果沒找到,再到系統指定的"包含檔案目錄"(由使用者在配置環境時設定)去找。 2.使用尖括號:直接到系統指定的"包含檔案目錄"去查詢。 通常使用雙引號比較保險。 ==============================預編譯 條件編譯指令將決定哪些程式碼被編譯,而哪些是不被編譯的。 可以根據表示式的值或者某個特定的巨集是否被定義來確定編譯條件。

#if、#else、#elif和#endif指令

一般形式有如下幾種 (1)
#if表示式 //語句段1 #else //語句段2] #endif
如果表示式為真,就編譯語句段1,否則編譯語句段2 (2)
#if表示式1 //語句段1 #elif表示式2 //語句段2 #else //語句段3 #endif
如果表示式1真,則編譯語句段1,否則判斷表示式2;如果表示式2為真,則編譯語句段2,否則編譯語句段3

#ifdef和#ifndef

(1)#ifdef的一般形式:
#ifdef巨集名 //語句段 #endif
作用:如果在此之前已定義了這樣的巨集名,則編譯語句段。 (2)#ifndef的一般形式:
#ifndef巨集名 //語句段 #endif
作用:如果在此之前沒有定義這樣的巨集名,則編譯語句段。 #else可以用於#ifdef和#ifndef中,但#elif不可以。