2016-05-13 66 views
1

下零ARGS我想使用的宏如下所示:## __ VA_ARGS__不吞嚥時逗號C99

#define x(...) y(a,##__VA_ARGS__,b) 

要擴大,像這樣:

x(); -> y(a,b); 
x(1); -> y(a,1,b); 

隨着-std=gnu99,它的工作原理完美。

隨着-std=c99但是,它看起來像這樣:

x(); -> y(a,,b); 
x(1); -> y(a,1,b); 

##正在沒有什麼區別 - 這不是吞嚥逗號。

在C99下的其他用法中,例如#define x(a,...) y(a,##__VA_ARGS__),逗號吞嚥工作正常。

我可以做什麼,如果有的話,以獲得所需的逗號吞嚥行爲叮鐺聲的-std=c99,無論是與GNU擴展##或其他方法?

+0

那麼,如何在實現方面工作(即如何函數消耗可變參數)? – trojanfoe

+0

@trojanfoe感謝您的評論,但這不在此問題的範圍內。 (這不是一個XY問題。) – Max

+0

@trojanfoe當然:如果沒有參數,我使用這個宏來調用'a()',或者如果有一個參數,我使用'b(x)':'GET_MACRO(_0 ,## __ VA_ARGS__,b,a)(__ VA_ARGS __)'。 – Max

回答

1

是的,##__VA_ARGS__是一個GNU擴展。

+0

看到我的問題:「在C99下的其他用法,例如'#define x(a,.. 。)y(a,## __ VA_ARGS __)',逗號吞嚥很好。「 – Max

+0

此外,我問是否有任何方法,使用'## __ VA_ARGS__'或不。 – Max

+0

剛剛用'std = c99 -pedantic'和行'#define x(a,...)y(a,## __ VA_ARGS __)'給出警告'Token'粘貼'','__VA_ARGS__' GNU擴展「。所以我認爲在C99下獲得逗號吞吐行爲是特定於你的編譯器/命令行參數的。它不是標準的C99。 –

1

這是預期的行爲。沒有標準的方法來吞下逗號。

幸運的是,gccclangxlc支持##__VA_ARGS__ GNU擴展,和自動msvc燕子逗號。

如果你不想依靠上述語言擴展,慣用ISO C90的方式來獲得可變參數宏是這樣的:

#define x(args) y args 

/* notice the extra parantheses */ 
x((a, b, c, d)); 

如果你不想使用其中任一解決方案,您可以隨時使用參數計數,如答案here