【问题标题】:Macroized Parameters宏化参数
【发布时间】: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 接受任意数量的参数 (...),并且不使用 ### 在它们上,所以任何宏参数(PARAM1PARAM2 等)应在正文中的 MACRO_1 被扫描或展开之前展开。

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


【解决方案1】:

这是 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(Wayback Machine)。如果此问题对您很重要,请支持该错误报告。

【讨论】:

  • 重新提交错误报告链接,“您请求的内容无法找到或您无权查看。” :( 我现在在 MSVC 11.0 的 11 月 CPT 中遇到了这个问题
  • @Cheersandhth.-Alf:旧错误已从 Connect 中删除。我被告知这是暂时的情况,但我不知道旧的错误何时会再次出现。我也不知道什么叫做“老”。我知道我们有一个错误在内部主动跟踪这个问题。这并不意味着它得到修复——我不能做出任何承诺——但这确实意味着我们没有忘记这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 2015-08-15
  • 2014-09-01
  • 2013-11-28
  • 2023-02-25
  • 2011-10-06
相关资源
最近更新 更多