为什么海湾合作委员会不会在c89模式中抱怨_Bool?

时间:2013-05-14 11:22:46

标签: gcc c89

为什么以下命令不会产生警告或错误,即使_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)]上。

1 个答案:

答案 0 :(得分:1)

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

  

- 所有以下划线开头的标识符和   大写字母或另一个下划线总是保留给任何人   使用

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

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