LINUX C中用define定義可變引數的巨集

2021-08-05 19:11:09 字數 717 閱讀 8778

一般在除錯列印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)去除掉它前面的那個逗號.

0

給主人留下些什麼吧!~~

LINUX C中如何定義可變引數的巨集

一般在除錯列印debug資訊的時候,需要可變引數的巨集.從c99開始可以使編譯器標準支援可變引數巨集 variadic macros 另外gcc也支援可變引數巨集,但是兩種在細節上可能存在區別.1.va args va args 將 傳遞給巨集 如 define debug format,fprin...

C (四)define 可變引數巨集

今日看到一行我沒見過的 cpp view plain copy define offset what printf what d n int ptr what 解讀 這個巨集 cpp view plain copy define offset what printf what d n int ptr...

可變引數的巨集定義

link todo 原理 printf 和fprintf 這些輸出函式的引數是可變的,在除錯程式時,你可能希望定義自己的引數可變的輸出函式,那麼可變引數巨集會是乙個選擇。c99中規定巨集可以像函式一樣帶有可變引數,比如 define log format,fprintf stdout,format,...