为什么以下命令不产生警告或错误,即使 _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)] 上。
最佳答案
使用 _Bool
在 C89 编译器中调用未定义的行为,因为您使用以下划线和大写字母开头的标识符。我手边没有 C89 的纸质副本,但希望它与 C99 7.1.3 相同:
— All identifiers that begin with an underscore and either an uppercase letter or another underscore are always reserved for any use.
一种允许的未定义行为是接受
_Bool
没有诊断。这是一个 GNU 扩展。当然,
bool
不属于实现命名空间,因此除非声明,否则必须进行诊断。
关于gcc - 为什么GCC在c89模式下不提示_Bool?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16541899/