c帶可變引數的巨集

2021-06-21 06:27:46 字數 558 閱讀 2436

在99版本的iso c標準中,定義了巨集可以接受可變引數,就如同函式一樣,例如:

#define debug(format, ...) fprintf(stderr, format, __va_args__)
這裡的"..."就是可變引數,呼叫時會替代巨集體裡的__va_args__。

#define debug(format, args...) fprintf(stderr, format, args)

在標準c中,既然是可變引數,那麼它就有可能不帶引數,那麼就有可能引起編譯錯誤,例如:

debug("a message");
上面的語句預編譯之後,得到下面的結果:
fprintf(stderr, "a message", );
也就是說結尾多了個逗號,為了解決這個問題,gnu的預處理器提供了乙個符號"##",修改後的巨集定義如下:

#define debug(format, ...) fprintf(stderr, format, ##__va_args__)
在預處理階段,如果巨集不帶可變引數,那麼cpp會去掉這個逗號。

C 可變引數的巨集

可變引數的巨集 1.可變引數的巨集是c99規範開始支援的,具體用法如下 define debug printf va args 預設號代表乙個可以變化的參數列。使用保留名 va args 把引數傳遞給巨集。當巨集的呼叫展開時,實際的引數就傳遞給 printf 了。如果預設號之前有逗號,就要寫成下面的...

C可變引數 printf(巨集處理可變引數)

x86平台下的巨集定義 typedef char va list 記憶體對齊 與sizeof int 對齊 0 sizeof n 4,intsizeof n 4 4 sizeof n 8,intsizeof n 8 define intsizeof n sizeof n sizeof int 1 s...

C語言可變引數巨集

歲月不饒人,這年紀大了記憶力真是差了很多。今天寫程式需要用到可變引數的巨集,可是忘了怎麼寫,這倒也沒什麼,因為我一向是不記憶這些語法細節的,反正我知道程式裡有個地方用到了這種技巧,但是可悲的是我忘了在哪個地方。搜尋?語法都忘了蒐個p呀。只好憑著印象,在自己負責的模組 中找了一圈,花了十幾分鐘才終於在...