在预处理条件中使用布尔字面值是否有效?

Is it valid to use boolean literals in preprocessor conditionals?

本文关键字:字面值 是否 有效 布尔 预处理 条件      更新时间:2023-10-16

考虑下面的代码,它导致布尔字面值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一元运算符的所有替换之后所有剩余的标识符和关键字,除了truefalse,被替换使用pp-number 0 ,然后将每个预处理令牌转换为令牌。产生的令牌包含控制常数表达式,该表达式根据5.19的规则使用算术求值它至少具有18.3中指定的范围。对于这个令牌的转换和评估的目的有符号整数类型和无符号整数类型的行为就好像它们分别具有与intmax_t相同的表示或uintmax_t(18.4)。这包括解释字符字面量,这可能涉及转换转义序列转换为执行字符集成员。是否为这些字符字面值的数值匹配在表达式中出现相同字符字面量时获得的值#if#elif指令)是实现定义的。此外,单字符字符字面量是否可以负值是实现定义的。类型为bool的每个子表达式都要进行整型处理