2012-04-03 15 views
2

私は多くのパラメータセットが "マクロ化"されたシステムを持っています( "#define name value、value、value"という形式のマクロです。)これらをマクロに渡したいのですが、 。マクロ化されたパラメータ

例:ビジュアルCIのGETで

void fn(int a, int b, int c){ return; } 

#define MACRO_1(a, b, c) fn(a, b, c) 
#define MACRO(...) MACRO_1(__VA_ARGS__) 
#define PARAM1 1 
#define PARAM2 2, 2 
#define PARAM3 3, 3, 3 

int main(int argc, char * argv[]){ 
    MACRO(0,0,0); 
    MACRO(PARAM1,1, 1); 
    MACRO(PARAM2,2); 
    MACRO(PARAM3); 
    return 0; 
} 

:。これは、Visual C++コンパイラのバグです

1>c:\main.c(10): warning C4003: not enough actual parameters for macro 'MACRO_1' 
1>c:\main.c(10): error C2059: syntax error : ',' 
1>c:\main.c(11): warning C4003: not enough actual parameters for macro 'MACRO_1' 
1>c:\main.c(11): error C2059: syntax error : ',' 
1>c:\main.c(12): warning C4003: not enough actual parameters for macro 'MACRO_1' 
1>c:\main.c(12): error C2059: syntax error : ',' 
1>c:\main.c(13): warning C4003: not enough actual parameters for macro 'MACRO_1' 
1>c:\main.c(13): error C2059: syntax error : ',' 
+0

Visual Cのバグのように見えます - 'MACRO'は任意の数の引数(...)をとり、'# 'や' ## 'を使用しないので、引数(' PARAM1'、 'PARAM2'など)は、本文中の' MACRO_1'が走査されるか展開される前に展開されるべきです。 –

答えて

6

コンパイラが正しく0123可変長引数パックを展開しません。が別のマクロの引数として表示されます。

#define MACRO_1(a, b, c) fn(a, b, c) 
#define MACRO_1_(args_list) MACRO_1 args_list 
#define MACRO(...) MACRO_1_((__VA_ARGS__)) 

は、マイクロソフト接続この問題のバグがあります:"Variadic Macro Replacement."この問題がある場合は

回避策が呼び出されるMACRO_1前に展開するための可変長引数のパックを強制する間接の追加の層を使用することですあなたにとって重要なことは、そのバグ報告をアップしてください。

+0

うわー、スマートハック。ありがとうございました。 – Benjamin

+0

+1 upvotedあなたとMSが接続: – Benjamin

+0

バグレポートのリンクを再度、 "あなたが要求したコンテンツを見つけることができないか、それを表示する権限がありません。 MSVC 11.0 –