gcc - 为什么GCC在c89模式下不提示_Bool?

标签 gcc c89

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

最佳答案

使用 _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/

相关文章:

c - 警告 : ISO C90 forbids mixing declarations and code [-Wdeclaration-after-statement]

c - 空指针的动态数组是否是 C 游戏开发的性能问题?

c - 三字符 ??/忽略,使用 -trigraphs 启用

c++ - 在 C++ 应用程序中使用 libgrib2c,链接器错误 "Undefined reference to..."

c++ - 公共(public)基类打破了元组的空基类优化

c - 在纬度/经度与 DMS 之间相互转换时遇到问题

c - 如何获得我的主要功能返回的内容?

无法用指针数组编译C89

c - 具有 C99 内联函数的 OpenBSD 5.9 header

c - 超出翻译限制是否是未定义的行为,是否有检查工具可以找到它?