4

多くのパラメータセットが「マクロ化」されたシステム(「#definename value、value、value」の形式のマクロ)があります。これらをマクロに渡したいのですが、エラーが発生します。

例:

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 CIで取得:

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 : ','
4

1 に答える 1

6

これは、VisualC++コンパイラのバグです。__VA_ARGS__別のマクロへの引数として表示される場合、コンパイラは可変個引数引数パックを正しく展開しません。

MACRO_1回避策は、間接参照の追加レイヤーを使用して、呼び出される前に可変個引数引数パックを強制的に展開することです。

#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__))

この問題にはMicrosoftConnectのバグがあります: 可変個引数マクロの置換(ウェイバックマシン)。この問題があなたにとって重要である場合は、そのバグレポートに賛成してください。

于 2012-04-03T22:33:25.547 に答える