在下面非常简单的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/