宏观参数

tle*_*nes 2 c macros visual-c++ c-preprocessor variadic-macros

我有一个系统,其中有许多参数集"macroized"(形式为"#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;
}
Run Code Online (Sandbox Code Playgroud)

在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 : ','
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 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__))
Run Code Online (Sandbox Code Playgroud)

此问题存在Microsoft Connect错误: "Variadic宏替换". 如果此问题对您很重要,请提供该错误报告.