4

我有一个带有许多“宏化”参数集的系统(“#define name 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

这是 Visual C++ 编译器中的一个错误。__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__))

此问题存在 Microsoft Connect 错误: 可变参数宏替换(Wayback Machine)。如果此问题对您很重要,请支持该错误报告。

于 2012-04-03T22:33:25.547 回答