巨集定義中的可變引數 VA ARGS

2021-10-25 20:17:36 字數 1204 閱讀 2475

#include

#define debug(fmt, ...) printf(fmt, __va_args__)

intmain()

輸出:you know i am handsome1000,

1.100000

,10

這裡的__va_args__其實就是指代…三個省略號的內容了,這就是這個結構的主體內容,基本已經成功了解了。

然後程式在使用的時候會有一些健壯性的增強,修修邊角了

首先是命名,__va_args__有點難寫所以產生了新的寫法

#define log(format, args...) printf(format, args)
很明確了,就是一種簡寫而已。

有乙個比較大的bug在這裡,就修一下

先簡單講解一下巨集定義,我們在巨集定義的時候大體可以做這樣的動作分解:

有括號引數就先把引數原原本本的傳進去,比如debug(8)裡面的x=8,就把後面的x全部換成8

接著把巨集定義後面的換過的內容放到巨集定義的位置

所以這裡就有乙個實際問題,很多時候我們為了用可變引數,都是把它加在我們想要的引數之後的,所以會在巨集定義的最後一部分有乙個逗號存在(引數一,引數二,可變引數)(就是那個第二個逗號),那這樣萬一我想要的是這次不用可變引數,可變引數為空,那內容是不是就變成了(引數一,引數二,),這樣會產生報錯。

#define debug(fmt, ...) printf(fmt, __va_args__)

debug

("you know i am handsome"

);

#define debug(fmt, ...) printf(fmt, ##__va_args__)

debug

("you know i am handsome"

);

第乙個報錯第二個正確執行。over

首先了解上面說的巨集定義展開分解動作,這兩個是在中間加了一步

有括號引數就先把引數原原本本的傳進去,比如debug(8)裡面的x=8,就把後面的x全部換成8

#是把他後面的內容轉變為字串,##是把他前後的東西連線成乙個整體的標誌符接著把巨集定義後面的換過的內容放到巨集定義的位置

這兩個東西其實應用的地方都非常特定

可變引數巨集定義 VA ARGS

1 使用va args define log printf va args define log err format,printf err format n va args define log err format,printf err format n va args 標準c要求至少帶有乙個引...

可變引數巨集 VA ARGS

可變引數巨集 va args 在 gnu c 中,巨集可以接受可變數目的引數,就象函式一樣,例如 define pr debug fmt,arg.printk kern debug fmt,arg 用可變引數巨集 variadic macros 傳遞可變參數列 你可能很熟悉在函式中使用可變參數列,如...

可變引數巨集 VA ARGS

可變引數巨集 va args 在 gnu c 中,巨集可以接受可變數目的引數,就象函式一樣,例如 define pr debug fmt,arg.printk kern debug fmt,arg 用可變引數巨集 variadicmacros 傳遞可變參數列 你可能很熟悉在函式中使用可變參數列,如 ...