在预处理条件中使用布尔字面值是否有效?
Is it valid to use boolean literals in preprocessor conditionals?
考虑下面的代码,它导致布尔字面值true
在预处理器条件中被求值:
#define SOME_MACRO true
int main ()
{
#if SOME_MACRO
return 1;
#else
return 0;
#endif
}
Clang 3.4和GCC 4.8都接受这个代码,即使是-pedantic -std=c++11 -Wall -Wextra
。
Visual Studio 2013拒绝它,并出现致命错误C1017:无效的整数常量表达式。
我对n3376§的阅读
如果是,这个代码是有效的,如果MSVC不接受它就是一个bug。
但是我觉得这个标准不是特别清楚。有人能证实吗?
是的,它是有效的。参见c++ 11§16.1/4(强调我的)
在求值之前,预处理令牌列表中的宏调用将成为控件替换常量表达式(由
defined
一元操作符修改的宏名除外);就像在普通文本中一样。如果令牌defined
是由于此替换过程或使用而生成的在宏替换之前,defined
一元操作符不匹配指定的两种形式之一;行为是未定义的。由于宏扩展和defined
一元运算符的所有替换之后所有剩余的标识符和关键字,除了true
和false
,被替换使用pp-number0
,然后将每个预处理令牌转换为令牌。产生的令牌包含控制常数表达式,该表达式根据5.19的规则使用算术求值它至少具有18.3中指定的范围。对于这个令牌的转换和评估的目的有符号整数类型和无符号整数类型的行为就好像它们分别具有与intmax_t
相同的表示或uintmax_t
(18.4)。这包括解释字符字面量,这可能涉及转换转义序列转换为执行字符集成员。是否为这些字符字面值的数值匹配在表达式中出现相同字符字面量时获得的值#if
或#elif
指令)是实现定义的。此外,单字符字符字面量是否可以负值是实现定义的。类型为bool
的每个子表达式都要进行整型处理
- 直接读取 pthread 互斥锁的所有者字段是否安全?
- 如何检查数据库字段是否为空
- 字大小是否限制内存地址的数量,而不是内存本身?
- const_casting可变字段是否安全
- 确定字段是否为空
- 如何检查结构的类型或字段是否存在
- 通过C强制转换访问结构的第一个字段是否违反了严格的别名
- 构造函数Initializer字段是否可以用类对象c++调用
- VB6和c++布尔字面值
- 为什么添加两个字符串字面值不使用操作符+
- 在编译时定义字符串/char字面值
- c++的字符串字面值如何存储在内存中?
- 为什么可以向字符串字面值添加整数?
- 用户定义字面值如何与数字分隔符一起使用
- 可修改字符串字面值的用例
- 是否有可能合法地重载字符串字面值和const char*
- 是否有可能获得包含字面值的字符串的长度
- 是否可以检查是否为给定类型和参数定义了用户字面值
- 在预处理条件中使用布尔字面值是否有效?
- 从字符串字面值初始化字符数组是否属于数组复制初始化的情况?