【发布时间】:2016-05-14 15:10:57
【问题描述】:
我正在处理的代码使用了一些非常复杂的宏 voodoo 来生成代码,但最终有一个看起来像这样的构造
#define ARGS 1,2,3
#define MACROFUNC_OUTER(PARAMS) MACROFUNC_INNER(PARAMS)
#define MACROFUNC_INNER(A,B,C) A + B + C
int a = MACROFUNC_OUTER(ARGS);
期望得到的是什么
int a = 1 + 2 + 3;
这适用于最初为 (GHS) 和 GCC 编写的编译器,但 MSVC (2008) 将 PARAMS 视为不会扩展的单个预处理令牌,然后将 A 设置为整个PARAM 和B 和C 什么都没有。结果是这样的
int a = 1,2,3 + + ;
而 MSVC 警告 not enough actual parameters for macro 'MACROFUNC_INNER'。
- 是否有可能通过一些技巧让 MSVC 进行扩展(另一层宏强制进行第二次扩展,一些放置得当的 ## 或 #,...)。承认改变构造的工作方式不是一种选择。 (即:我可以自己解决问题吗?)
- C 标准对这种极端情况有什么看法?我在 C11 规范中找不到任何明确说明如何处理包含参数列表的参数的内容。 (即:我可以与代码的作者争论他必须重新编写它,还是只是 MVSC 不符合?)
【问题讨论】:
-
MSVC 不符合 C99 或 C11。 MS 从来没有表现出对标准一致性的重视,特别是对语言标准的详细一致性。
-
我的意见可能跑题了。但是使用在 C 之上发明一种语言的宏是很糟糕的,只有在没有其他方法的情况下才作为最后的手段使用。添加三个值有多难?
-
@WeatherVane 这是一个普遍的问题。一方面,每个人都想要 MCVE。但另一方面,这可能会削弱对作者真实意图的看法,使结构看起来毫无用处。
标签: c visual-c++ gcc macros language-lawyer