【发布时间】:2012-04-17 15:21:57
【问题描述】:
我有一个带有许多“宏化”参数集的系统(“#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 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 : ','
【问题讨论】:
-
看起来像 Visual C 中的一个错误 --
MACRO接受任意数量的参数 (...),并且不使用#或##在它们上,所以任何宏参数(PARAM1、PARAM2等)应在正文中的MACRO_1被扫描或展开之前展开。
标签: c visual-c++ macros c-preprocessor variadic-macros