为什么GCC不抱怨c89模式下的_Bool?

为什么GCC不抱怨c89模式下的_Bool?,gcc,c89,Gcc,C89,为什么以下命令不产生警告或错误,即使\u Bool不是C89的一部分 $ echo "_Bool x;" | gcc -x c -c -std=c89 -pedantic -Wall -Wextra - 为了进行比较,将\u Bool更改为Bool会导致错误: $ echo "bool x;" | gcc -x c -c -std=c89 -pedantic -Wall -Wextra - <stdin>:1:6: error: expected ‘=’, ‘,’, ‘

为什么以下命令不产生警告或错误,即使
\u Bool
不是C89的一部分

  $ echo "_Bool x;" | gcc -x c -c -std=c89 -pedantic -Wall -Wextra -
为了进行比较,将
\u Bool
更改为
Bool
会导致错误:

  $ echo "bool x;" | gcc -x c -c -std=c89 -pedantic -Wall -Wextra -
  <stdin>:1:6: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘x’
$echo“boolx;”| gcc-xc-c-std=c89-pedantic-Wall-Wextra-
:1:6:错误:应为“=”,“,”,“;”,”“x”之前的asm'或“_属性”

这发生在Cygwin[gcc(gcc)4.5.3]和Linux[gcc(gcc)4.1.2 20080704(Red Hat 4.1.2-54)]上。

在C89编译器中使用
\u Bool
调用未定义的行为,因为使用的标识符以下划线和大写字母开头。我手头没有C89的纸质副本,但希望它与C99 7.1.3相同:

-以下划线和 大写字母或其他下划线始终保留给任何 使用

一种允许的未定义行为是在没有诊断的情况下接受
\u Bool
。这是一个GNU扩展


当然,
bool
不属于实现名称空间,因此除非声明,否则必须进行诊断。

因此,当调用未定义的行为时,GCC不会发出警告?更正:当在c89模式下使用_Complex时,它会发出警告,而不是_bool。似乎相当武断。在一般情况下检测未定义的行为是不可能的(它需要解决停止问题)。对于特定的情况,它可能是可行的,这就是为什么C标准明智地保留了它的开放性。未定义的是未定义的是未定义的。任何事情都有可能发生。诊断就是一切。保持沉默也是一件很重要的事情。当然,但这是一个非常特殊的情况,它似乎是以一种方式为_Complex和另一种方式为_Bool任意处理的。您可以随时游说GCC维护人员将其更改为“与_Complex保持一致”。但这并不是一个强有力的论据,我更喜欢这个问题:-)即使在C99中,
bool
如果没有
#include