c - 宏观参数

标签 c visual-c++ macros c-preprocessor variadic-macros

我有一个带有许多参数集“宏化”的系统(形式为“#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++ 编译器中的一个错误。当 __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 错误:Variadic Macro Replacement (回归机器)。如果此问题对您很重要,请对该错误报告进行投票。

关于c - 宏观参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10002296/

相关文章:

c++ - 是否可以在给定基数的 MSVC/VC++ 中分配内存?

clojure - 定义多个 var clojure 宏

shell - 运行 shell 命令并返回输出作为自定义函数的结果

c - 我以为存在内存入侵问题,是吗?

c - 比较float变量和无符号整数时出现意外结果

c++ - Visual Studio 2010 X86 版本忽略#pragma 警告和/W0 C++

c++ - 在 Visual C++ 6.0 中支持纯 Unicode 语言(最好不使用 Unicode!)

c - 如何在程序集中创建结构成员指针?

c++ - C/C++ 中的冒号运算符

c++ - 创建线程时设置 CPU 亲和性