为什么以下命令不会产生警告或错误,即使_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)]上。
答案 0 :(得分:1)
在C89编译器中使用_Bool
会调用未定义的行为,因为您使用以下划线和大写字母开头的标识符。我没有C89的纸质副本,但期望它与C99 7.1.3相同:
- 所有以下划线开头的标识符和 大写字母或另一个下划线总是保留给任何人 使用
一个允许的未定义行为是在没有诊断的情况下接受_Bool
。这是一个GNU扩展。
当然,bool
并不属于实现命名空间,因此除非声明,否则必须进行诊断。