#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,在引數...