十一 預處理

2021-08-21 19:28:35 字數 2005 閱讀 6371

凡是以 「 # 」 號開頭的均為預處理命令

在源程式中這些命令都放在函式之外,而且一般都放在原始檔的前面

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...