一般在除錯列印debug資訊的時候, 需要可變引數的巨集. 從c99開始可以使編譯器標準支援可變引數巨集(variadic macros), 另外gcc也支援可變引數巨集, 但是兩種在細節上可能存在區別.
1. __va_args__
__va_args__ 將 "..." 傳遞給巨集 . 如
#define debug(format, ...) fprintf(stderr, format, __va_args__)
2. gcc的複雜巨集
gcc使用一種不同的語法,從而可以給可變引數乙個名字,如同其它引數一樣.
#define debug(format, args...) fprintf (stderr, format, args)
這和第一條的巨集例子是完全一樣的,但是這麼寫可讀性更強並且更容易進行描述.
3. ##__va_args__
上面兩個定義的巨集,如果出現 debug("a message")的時候,由於巨集展開後有個多餘的逗號,所以將導致編譯錯誤.
為了解決這個問題,cpp 使用乙個特殊的"##"操作,格式如下:
#define debug(format, ...) fprintf (stderr, format, ## __va_args__)
這裡,如果可變引數被忽略或為空,"##"操作將使預處理器(preprocessor)去除掉它前面的那個逗號. LINUX C中用define定義可變引數的巨集
一般在除錯列印debug資訊的時候,需要可變引數的巨集.從c99開始可以使編譯器標準支援可變引數巨集 variadic macros 另外gcc也支援可變引數巨集,但是兩種在細節上可能存在區別.1.va args va args 將 傳遞給巨集 如 define debug format,fprin...
如何自定義可變引數函式
在我們編寫 中,有時需要我們自定義可變引數函式,像庫函式中有pirntf,ioctl都是可變引數函式,如果我們要實現自定義可變引數,一般要實現像int ioctl int fd,unsigned long request,這種功能的。下面講解如何實現ioctl這個型別函式 1.通過分析printf函...
巨集定義中的可變引數 VA ARGS
include define debug fmt,printf fmt,va args intmain 輸出 you know i am handsome1000,1.100000 10這裡的 va args 其實就是指代 三個省略號的內容了,這就是這個結構的主體內容,基本已經成功了解了。然後程式在...