凡是以 「 # 」 號開頭的均為預處理命令
在源程式中這些命令都放在函式之外,而且一般都放在原始檔的前面
1、無參巨集定義
無參巨集的巨集名後不帶引數
一般形式為: #define 識別符號 字串 例: #define pi 3.1415926
其中 define 為巨集定義命令。「識別符號」為所定義的巨集名。「字串」可以是常數、表示式、格式串等
注意:a. 巨集定義不是說明或語句,在行末不必加分號,如加上分號則連分號也一起置換
b. 巨集定義必須寫在函式之外,其作用域為巨集定義命令起到源程式結束。如要終止可使用 #undef 命令
c. 巨集名在源程式中若用引號括起來,則預處理程式不對其作巨集代換 例: printf ( " pi " ) ; 則會輸出pi
d. 巨集定義允許巢狀,習慣上巨集名用大寫字母表示,便於區分
e. 可用巨集定義表示資料型別 例: #define integer int 所以 integer a == int a
f. 對 「輸出格式」 作巨集定義 例: #define p printf #define d "%d\n"
2、巨集定義表示資料型別和用 typedef 定義資料說明符的區別:
巨集定義只是簡單的字串代換,是在預處理完成的,而 typedef 是在編譯時處理的,它不是簡單的代換,而是對型別說明符重新命名。被命名的識別符號具有型別定義說明的功能。typedef 後面加分號。
例: #define pin1 char*
typedef char* pin2;
pin1 x,y; (相當於 char *x , y)
pin2 a.b; (相當於 char *a , *b)
printf ( " by #define : %d %d \n\n",sizeof (x) , sizeof (y) ) ;
printf ( " by typedef : %d %d \n\n",sizeof (a) , sizeof (b) ) ;
輸出結果為: by #define : 4 1
by typedef : 4 4
3、帶參巨集定義
在巨集定義中的引數成為形式引數,在巨集呼叫中的引數成為實際引數
一般形式: #define 巨集名(形參表) 字串
注意:a. 巨集名和形參表之間不能有空格出現 例:正確寫法 #define max(a,b) (a>b)?a:b
錯誤寫法 #define max (a,b) (a>b)?a:b
b. 形式引數不分配記憶體單元,因此不必作型別定義。而巨集呼叫中的實參有具體的值,要作型別說明
c. 在巨集定義中形參是識別符號,而巨集呼叫中的實參可以是表示式 例:#define say(y) (y)
say[ i ] = say( say[ i ]+1)
d. 在巨集定義中,字串內的形參通常用括號括起來,避免出錯
e. 巨集呼叫時是以實參代換形參,而不是「值傳送」
4、檔案包含
乙個 include 命令只能指定乙個被包含檔案,若有多個檔案要包含,則需用多個 include 命令
檔案包含允許巢狀,即在乙個被包含的檔案中又可以包含另乙個檔案
5、條件編譯
條件編譯允許只編譯源程式中滿足條件的程式段,使生成的目標程式較短,從而減少了記憶體的開銷並提高了程式的效率
三種形式:
專案十一 預處理指令
專案概述 在c語言中,除了前面我學到的語句之外,還有一種特殊的語句叫預處理語句,本專案就是對預處理語句進行學習,這裡語句不是實現程式的功能,而是給c程式編譯提供很重要的資訊,通知c程式進行編譯之前做哪些預處理。在這專案我中將會學到預處理的指令學到巨集定義以及檔案包含,學完此專案對大家編寫程式的能力大...
(c c 學習筆記十一)預處理命令
預處理是指在進行編譯的第一遍掃瞄 語法掃瞄和語法分析 之前所做的工作。預處理是c語言的乙個重要功能,它由預處理器負責完成。當對乙個原始檔進行編譯時,系統將自動引用預處理程式對程式中的預處理部分作處理,處理完畢後自動進入對源程式的編譯。c語言提供了多種預處理功能,如巨集定義 檔案包含 條件編譯等。一....
c 預處理和預處理命令
預處理發生在編譯之前,預處理輸出的是乙個單一的檔案,這個檔案被送到編譯器,進行編譯。每條預處理命令都控制預處理器的行為。每條預處理命令佔據一行,有以下的格式 character 預處理命令 one of define,undef,include,if,ifdef,ifndef,else,elif,e...