C C 的「巨集」(macro)的可變長引數語法

2021-08-25 14:21:55 字數 1522 閱讀 3558

#define eprintf(format, args...) fprintf (stderr, format, args)
或者

#define eprintf(format, args...) fprintf (stderr, format, ##args)
#define eprintf(format, ...) fprintf (stderr, format, __va_args__)
#define eprintf(format, ...) fprintf (stderr, format, ##__va_args__)
警告:這是未來標準的語法,現在不支援。預計要2023年之後發布的編譯器才支援。

#define eprintf(format, ...) fprintf (stderr, format __va_opt__(,) __va_args__)
gcc特色的「雙井號」(##),是用於解決尾隨逗號問題的,例如:

如果#define eprintf(format, args...) fprintf (stderr, format, args)

#define eprintf(format, ...) fprintf (stderr, format, __va_args__)

那麼eprintf("%d %d\n", 10, 14);擴充套件成fprintf (stderr, "%d %d\n", 10, 14);

編譯通過。

但是,

eprintf("hello world\n");擴充套件成fprintf (stderr, "hello world\n", );

此**存在尾隨逗號,於是編譯錯誤。

如果#define eprintf(format, args...) fprintf (stderr, format, ##args)

#define eprintf(format, ...) fprintf (stderr, format, ##__va_args__)

#define eprintf(format, ...) fprintf (stderr, format __va_opt__(,) __va_args__)

那麼eprintf("%d %d\n", 10, 14);擴充套件成fprintf (stderr, "%d %d\n", 10, 14);

編譯通過。

並且eprintf("hello world\n");擴充套件成fprintf (stderr, "hello world\n");

編譯通過。

C C 巨集定義的可變引數

c c 巨集定義的可變引數 編寫 的過程中,經常會輸出一些除錯資訊到螢幕上,一般會呼叫printf這類的函式。但是當除錯解決之後,我們需要手工將這些地方刪除或者注釋掉。最近在看 linux c程式設計一站式學習 這本書,就想到乙個方法 voidmyprintf char fmt,ifdefdebug...

C C 巨集定義的可變引數

3 10 web開發 dante 16,686 編寫 的過程中,經常會輸出一些除錯資訊到螢幕上,一般會呼叫printf這類的函式。但是當除錯解決之後,我們需要手工將這些地方刪除或者注釋掉。再這次的專案中就用到類似問題,為了除錯程式,再一些地方輸出了很多的資訊,隨著專案的除錯,輸出的資訊越來越多。於是...

c c 計算可變引數巨集 VA ARGS

如何計算可變引數 va args 中的引數個數?google上找了一下,網上答案不少,仔細看看原理都是一樣的,比如這篇stackoverflow上的問題,給出的答案真不少,c preprocessor va args number of arguments 1 但是排名第一的最佳答案有bug,在引數...