C語言巨集定義總結

2021-09-29 02:47:48 字數 1629 閱讀 5084

巨集定義是在編譯器編譯過程中就會執行掉的操作,這裡將常用規則和方法總結,後續會更新,方便查詢。

無參巨集定義和帶參巨集定義就不講了,看一下就會了。(這裡主要針對我在實際過程中遇到的問題)

這是乙個很常見的問題,網上有很多解釋,但受限於每個人掌握的知識程度不同,因此真正理解還是得看個人。

先說一下#和##的區別。

#就是對後面的token加上乙個雙引號("")然後連起來;

##就是將token對應的值直接連起來。

例如:

#include #define max max

#define max2 max##_##max

#define print(num) printf("%s",#num)

void main()

我在這個使用過程中碰到的乙個問題:字串與token的區別

其實區別很好理解,但在實際使用中,在巨集定義裡,你需要知道你的表示符代表的到底是字串還是token。

//示例1

#define mynum "mynum";

#define num(a,b) a##b

char* temp = num(my,num);

//示例2

#define num2(a,b) (a b)

char* temp2 = num2("my","num");

上面是兩個例子,例一中的num中的my,和num在巨集定義中會作為token,然後通過##直接連起來,這個是沒有雙引號的!而且這個是無法用其他變數替代,除了巨集定義的。而在例二中傳入的是兩個字串,巨集定義中兩個字串中間空一格就可以連起來,不需要加##。

__line__  能夠表示該行**在第幾行

__file__  表示**在哪個檔案

__data__  表示原始檔被翻譯到**時的日期 月/日/年

__time__  時:分:秒

__stdc__  定義後(賦值1),按照ansic標準進行編譯

__func__  (編譯器不一定都有),表示執行到哪個函式

__cplusplus  使用c++編譯器時,會被定義為1

__va_args__  可變引數的巨集。新的c99規範中新增加的。gcc支援,其他的清楚

(1)__line__、__file__、__func__常用來測試程式(bug輸出)。

(2)__va_args__  用法如下:

就是替換將巨集定義中的「...」

#include #define printf(fmt,...) printf(#fmt,##__va__args__)

#define printfs(...) printf(__va__args__)

void main()

3.其他常用的巨集定義方法

為了防止標頭檔案中變數被多次定義,標頭檔案會書寫成下面格式 #ifndefine name_h

#define name_h

標頭檔案內容

#endif

防止錯誤

(1)小括號包含(主要是計算上使用)  #define add(a,b) (a+b)

(2)用do{}while(0)語句包含多語句防止錯誤  #define foo(x) dowhile(0)

使用「\」實現換行

C語言 巨集定義的用法總結

define 函式 define debug x x x 如上所示,用於對數值表示式進行求值的巨集定義都應該用這種方式加上括號,避免在使用巨集時由於引數中的操作等或鄰近操作符之間不可預料的相互作用。define 替換 1.在呼叫巨集時,首先對引數進行檢查,看看是否包含任何由 define 定義的符號...

C語言巨集定義

c語言有很多預處理命令,如包含命令 include,巨集定義命令 define。預處理命令在程式編譯之前被編譯器處理,而巨集定義也在此時被替換。或c 語言源程式中允許用乙個識別符號來表示乙個字串,稱為 巨集 被定義為 巨集 的識別符號稱為 巨集名 在編譯預處理時,對程式中所有出現的 巨集名 都用巨集...

C語言巨集定義

乙個巨集定義的作用域是從定義處到 undef處或檔案結尾。undef num 現在此處num沒有定義。1.ifdef num 如果num有巨集定義就編譯此處。else 如果num沒有巨集定義就編譯此處 endif 不論num 有沒有巨集都編譯,即判斷體已結束。ifndef num 如果num沒有巨集...