2016-12-14 170 views
0

我在尋找使一個可擴展到額外的參數宏的方式:宏擴展到額外的宏參數

int constant1=2, constant2=3; 
#define add_three_arguments(x,y,z) x+y+z 
#define extra_arguments ,constant1,constant2 
#define make_value(A) add_three_arguments(A extra_arguments) 

int r = make_value(5); 
+2

爲什麼你想要一個宏,而你肯定可以使用一個函數來做到這一點? –

+1

不直接相關,bit__never__像'#define add_three_arguments(x,y,z)x + y + z'一樣定義宏,但總是將表達式放入'()'中,如下所示:'#define add_three_arguments(x,y,z )(x + y + z)'。否則,如果你使用'x = add_three_arguments(1,2,3)* 10',結果將不會是你所期望的。 –

+1

如果您想告訴我們您要在此實現的更高級別的目標,這將非常有幫助。 –

回答

0

嘗試以下操作:

#define EMPTY 
#define EVAL(X) X 
#define add_three_arguments(x,y,z) x+y+z 
#define extra_arguments ,constant1,constant2 
#define make_value(A) EVAL(add_three_arguments EMPTY (A extra_arguments)) 

make_value(5); 

然而,如果你重新設計宏可能會得到一個更好的解決方案,而不需要這樣的構造。

0

我已經發現的最接近的解決方案是這樣的:

int constant1=2, constant2=3; 
#define _add_three_arguments(x,y,z) x+y+z 
#define add_three_arguments(...) _add_three_arguments(__VA_ARGS__) 

#define extra_arguments ,constant1,constant2 
#define make_value(A) add_three_arguments(A extra_arguments) 

int r = make_value(5); 

這當然不是我說的問題的解決方案。所以目前的答案似乎是,「這是不可能的。」但是也許一個新版本的clang/gcc會以某種方式啓用它。我會留下這個問題。