C中_Bool和bool类型的区别?

Posted

技术标签:

【中文标题】C中_Bool和bool类型的区别?【英文标题】:Difference between _Bool and bool types in C? 【发布时间】: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。 【参考方案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 的宏

【讨论】:

以上是关于C中_Bool和bool类型的区别?的主要内容,如果未能解决你的问题,请参考以下文章

c语言中 int,char,real,bool,const分别定义啥类型的数据

vs里面bool类型如何转换为string类型

_Bool类型和严格别名

C#bool布尔型的用法

ios中BOOL和bool的区别

c语言中 int,char,real,bool,const分别定义啥类型的数据