4

为什么即使_Bool不是 C89 的一部分,以下命令也不会产生警告或错误?

  $ echo "_Bool x;" | gcc -x c -c -std=c89 -pedantic -Wall -Wextra -

为了比较,更改_Boolbool会导致错误:

  $ 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)] 上。

4

1 回答 1

1

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

— 以下划线和大写字母或另一个下划线开头的所有标识符始终保留用于任何用途。

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

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

于 2013-05-14T11:35:32.943 回答