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

4
为什么以下命令不会产生任何警告或错误,尽管 _Bool 不是 C89 的一部分?
  $ echo "_Bool x;" | gcc -x c -c -std=c89 -pedantic -Wall -Wextra -

相比之下,将_Bool更改为bool会导致错误:

  $ echo "bool x;" | gcc -x c -c -std=c89 -pedantic -Wall -Wextra -
  <stdin>:1:6: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘x’

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

即使在C99中,没有包含#include <stdbool.h>,也不存在bool - Keith Thompson
1个回答

1
在C89编译器中使用_Bool会引起未定义行为,因为您使用了以下划线和大写字母开头的标识符。我手头没有C89的纸质副本,但是预计与C99 7.1.3相同:

—所有以下划线和大写字母或下划线开头的标识符都保留供任何用途使用。

一种可接受的未定义行为是在没有诊断的情况下接受_Bool。这是GNU扩展。

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


当未定义的行为被调用时,GCC不会发出任何警告吗? - Jeremy
更正:在c89模式下使用_Complex时会发出警告,但不会对_Bool发出警告。这似乎相当武断。 - Jeremy
检测一般情况下的未定义行为是不可能的(需要解决停机问题)。对于特定情况,这可能是可行的,这就是为什么C标准明智地将其保持开放的原因。未定义就是未定义就是未定义。任何事情都有可能发生。诊断可以是任何东西。保持沉默也是任何东西。 - Jens
当然可以,但这是一个非常特殊的情况,似乎对于_Complex和_Bool采用了不同的任意处理方式。 - Jeremy
你可以向GCC维护者游说,要求他们将其更改为“与_Complex一致”。但这不是一个强有力的论点,只是一个我更喜欢它这样的问题 :-) - Jens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接