【问题标题】:Why does GCC not complain about _Bool in c89 mode?为什么 GCC 在 c89 模式下不抱怨 _Bool?
【发布时间】:2013-05-08 15:48:13
【问题描述】:

为什么即使_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 &lt;stdbool.h&gt;bool 也不存在

标签: gcc c89


【解决方案1】:

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

——所有以下划线开头的标识符 大写字母或其他下划线始终保留给任何 使用。

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

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

【讨论】:

  • 那么当调用未定义的行为时 GCC 不会发出警告?
  • 更正:当 _Complex 在 c89 模式下使用时会发出警告,而不是 _Bool。似乎相当随意。
  • 在一般情况下检测未定义的行为是不可能的(它需要解决停机问题)。对于特定情况,它可能是可行的,这就是 C 标准明智地将其保持开放的原因。未定义未定义未定义。任何事情都有可能发生。诊断是任何东西。保持沉默也很重要。
  • 当然可以,但这是一个非常具体的案例,对于 _Complex 和 _Bool 的另一种方式似乎是任意处理的。
  • 您可以随时游说 GCC 维护人员将其更改为“与 _Complex 一致”。但这对于一个我更喜欢它的问题来说并不是一个强有力的论据:-)
猜你喜欢
  • 2016-02-27
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
  • 2022-10-25
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
相关资源
最近更新 更多