【问题标题】:Difference between _Bool and bool types in C?C中_Bool和bool类型的区别?
【发布时间】:2012-02-02 04:56:28
【问题描述】:

谁能解释一下 C 中的 _Boolbool 数据类型有什么区别?

例如:

 _Bool x = 1;
  bool y = true;

  printf("%d", x);
  printf("%d", y);

【问题讨论】:

  • bool 也必须是 typedef,C 没有那种类型。
  • 类似于_Complex vs complex。

标签: c types boolean


【解决方案1】:

这些数据类型是在 C99 中添加的。由于 bool 在 C99 之前没有保留,因此他们使用 _Bool 关键字(已保留)。

bool_Bool 的别名,如果您包含stdbool.h。基本上,包含stdbool.h 标头表明您的代码可以使用标识符bool 被“保留”,即您的代码不会将其用于自己的目的(类似于标识符true 和@ 987654329@)。

【讨论】:

  • 长期的意图似乎是该标准最终将被修订以使 bool 成为关键字。这是第 1 步,您可以在其中使用 来获取 bool 宏,并且您仍然可以出于自己的邪恶目的取消定义或重新定义它。第 2 步将拒绝从 取消定义或重新定义 bool 以阻止此类恶作剧。然后第 3 步是使 bool 成为与 _Bool 完全相同的关键字并标记 _Bool 已弃用。在这条漫长道路的尽头(比如说,从现在开始的一两年)标准 C 代码将拥有一个 bool 类型,而新程序员不会知道它曾经缺少过一个。
  • 我不明白为什么这必须花费两年时间,因为这是一个非常明显的改进。不喜欢这种变化的代码仍然可以使用当前的编译器版本进行编译。
  • 我认为 C 标准永远不会被修改为使 bool 成为关键字。考虑到字符串字面量的类型仍然是char *,你仍然可以使用非原型函数声明。
  • @JL2210 是的,但是每个不是语言律师的人在想到 C11 时都会想到默认接受的语言(即 C11 + 默认情况下激活的任何扩展集),因此说“你不能使用非原型函数声明,因为在 C90 之后”只会让人们比现在更加困惑。
  • @JL2210 我会这样说:“非​​原型函数声明是 1989 年原始 C 标准的过时特性。它们已从标准的后续修订版中删除,但仍为现代编译器所接受为了向后兼容。不要在新代码中使用它们。"
【解决方案2】:

没有区别。

bool 是在stdbool.h 中扩展为_Bool 的宏。

true 是在stdbool.h 中展开为1 的宏

【讨论】:

    猜你喜欢
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2011-03-02
    • 2011-09-19
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多