在下面非常简单的C程序中,预期的编译器错误是什么gcc给了我1,而MSVC 2013给了我2。

#define foo
#define bar (defined(foo))

#if bar
#error 1
#else
#error 2
#endif

我的问题希望同样简单:
C规范对defined()的值有何规定我看不出来
找到任何关于将其值设为另一个值的东西
宏。
实际的代码不是我能控制的,而且到处都在使用“#if bar”什么是最简单的方法来改变定义,以便在MSVC中,如果bar可以按“预期”工作我唯一能想到的就是把它扩展开来:
.
#ifdef foo
#define bar 1
#else
#define bar 2
#endif

最佳答案

C规格说明:
§6.10.1/1表达式如果标识符当前定义为宏名(即,如果它是预定义的,或者如果它是defined identifier预处理指令的主题,而没有具有相同主题标识符的中间defined(identifier)指令),则可以包含1#define形式的一元运算符表达式,如果不是,则计算为#undef
§6.10.1/4预处理令牌列表中的宏调用
将替换控制常量表达式(修改的宏名除外
通过0一元运算符),就像在普通文本中一样如果令牌defined
由于此替换过程或使用defined一元运算符而生成
在宏替换之前,与指定的两个窗体之一不匹配,行为为
未定义。在宏扩展和defined一元的所有替换之后
操作符已被执行,所有剩余标识符(包括词汇)
与关键字相同)替换为pp数字0,然后每次预处理
令牌被转换为令牌。
(强调我的)
然而,宏替换的方式非常复杂,我认为MSVC将defined定义为foo这是未定义的行为,而GCC将defined(bar)定义为foo是正确的由于MSVC当时处于未定义的行为中,它会做一些奇怪的事情。
正如你所说,最简单的解决方法是

#ifdef foo
#define bar 1
#else
#define bar 2
#endif

关于c - 设置为define()结果的宏可以期望什么值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27278596/

10-14 02:17