預處理器(巨集的用法)

2021-07-24 08:58:43 字數 3599 閱讀 5473

編譯器在對巨集預處理時,會:

1.將標頭檔案展開

2.去掉注釋

3.巨集替換

4.條件編譯

巨集替換時應注意的幾點:

1).## 會把它兩邊的字元轉換為乙個字元

2).巨集要替換乙個函式或者引數時,需要加上()

3).鄰近字元連線原則

4).#value ,value指代乙個變數名,#會將該字面值轉換為乙個字串「value」

1.預處理時對預定義符號的執行:

file//當前正在編譯的原始檔

time//檔案被編譯的時間

date//檔案被編譯的日期

line//檔案當前的行號

stdc

printf(「time : %s\n,line : %d\n,date : %s\n,file : %d\n」,time,line,date,file);

預處理指令:

#include

#define

預處理器讀入源**,根據預處理指令對其進行修改,然後將處理過的源**遞交給編譯器

2.在對數值表示式進行求值的巨集定義時,要給每個引數都加上括號,以及給整體也要加上括號,以防引數中的操作符或者臨近操作符的不可**導致錯誤

3.在對乙個**塊進行巨集定義時,最好使用do{}while(0)

4.下面程式執行出錯,因為在#define定義時後面加了乙個分號,導致在執行完debug語句後,後面還有乙個空語句,所以導致else沒有與之相匹配的if語句了,所以要記住,巨集定義後面不要加上分號

#define _crt_secure_no_warnings 1

#include

#include

#include

#define debug printf("time : %s\nline : %d\ndate : %s\nfile : %d\n",__time__ ,__line__ ,__date__ ,__file__ );

unsigned

char i = 0;

int main()

5.巨集替換時應注意的幾點:

1)鄰近字串連線特性

#define _crt_secure_no_warnings 1

#include

#include

#include

#define m 9

#define print(format ,value) printf("the value is "format"\n",value);

int main()

2)使用預處理器將巨集引數轉換為字串

(#arguement 被處理器處理為「arguement」)

#define _crt_secure_no_warnings 1

#include

#include

#include

#define m 9

#define print(format ,value) printf("the value "#value " is "format"\n",value);

int main()

結果如下:

3)##將它兩邊的字元連線為乙個字元

#define _crt_secure_no_warnings 1

#include

#include

#include

#define m "hello"

#define n "world"

#define mn "hello bit"

#define link(m,n) m##n

int main()

結果如下:

條件編譯:

使用條件編譯,你可以選擇**的一部分是被正常編譯還是被忽略

基本結構:

#if (常量表示式) (常量表示式是由預處理器進行求值的)

statements

#endif

如果常量表示式的值為真,則statements部分被正常編譯,否則,預處理器就刪除掉statements部分

測試乙個符號是否被定義:

#ifdef symbol

#endif

#ifndef symbol

#endif

巨集函式和函式的區別:

1)如果函式的**特別長,使用巨集定義時,會在每次呼叫巨集函式時都會將源**

替換到源程式中,程式的長度將大幅度增長;(巨集的缺點)

2)巨集引數的求值是在所有周圍表示式的上下文環境中,除非加上括號,否則鄰近操作符 的優先順序可能會影響使之產生不可預料的結果;(巨集的缺點)

3)引數每次用於巨集定義時,它們都將重新求值,由於多次求值,具有***的引數可能會產生不可預料的結果;(缺點)

4)巨集與型別無關,只要對引數的操作是合法的,它可以使用任何引數型別(優點)

5)巨集的執行速度快(優點)

函式:

1)函式**只出現在乙個地方,每次呼叫這個函式,都呼叫那個地方的同乙份**;(優點)

2)存在函式呼叫/返回的額外開銷(缺點)

3)函式引數只在函式呼叫時求值一次,它的結果值傳遞給函式,表示式的求值

結果更容易**;(優點)

4)引數在函式呼叫前只求值一次,在函式中多次使用引數並不會導致多種求值過程;(優點)

5)函式的引數時與型別有關的,如果引數的型別不同,則需要使用不同的引數;(缺點)

預處理器之巨集定義

以 開頭的命令都是預處理命令,預處理不是c語言的語句,不能被編譯器編譯。所以在編譯之前需要使用預處理器做檔案的預處理工作。在編譯之前,所有的預處理語句都要被處理 替換或展開 eg1 一般巨集定義 define num 100eg2 有引數的巨集定義 define s a,b a beg3 寫乙個巨集...

預處理器之巨集的使用

我們知道c程式在編譯過程之前,c語言預處理器首先對程式 作了了必要的轉換處理。巨集在c程式中是非常有用的,比如我們可以通過修改巨集定義來修改在程式中出現的所有例項。同時通過巨集定義還可以免去函式呼叫帶來的重大系統開銷。雖然巨集定義非常有用,但是巨集定義也是非常容易出錯的。主要表現為以下幾點 1 不能...

xcodebuild 如何定義預處理器巨集

您在xcodebuild命令列上傳遞gcc preprocessor definitions。請記住,對於類似shell的單詞拆分和引用處理,將重新評估引數,因此您需要小心,尤其是當您的巨集值不僅僅是簡單的1時 例如,nsstring文字 同樣重要的是在你設定的值內擴充套件gcc preproces...