为什么要使用 <stdbool.h> 而不是 _Bool?

15
任何时候我需要使用布尔类型时,我被告知要么创建一个,要么最好使用stdbool.h

由于 stdbool.h 使用typedef bool _Bool,所以是否有理由使用头文件而不是只使用类型_Bool?它只是为了额外的宏(/* #define true 1 #define false 0 */)吗?

3个回答

17

很明显要加入语言的类型是 bool。但不幸的是,有大量的代码包含了以其他形式和方式使用的 bool。请记住,对布尔类型的支持仅在 C99 中添加。

因此,C 语言委员会别无选择,只能为其提取一个保留标识符(_Bool)。但是,由于类型名称的明显选择仍然相同,stdbool.h 被添加,以允许用户使用明显的名称。这样,如果您的代码没有自己定义的 bool,则可以使用内置的类型。

因此,确实在不受现有自定义的 bool 的约束时,请使用 stdbool.h。它将成为标准类型,并具有该类型带来的所有优势。


回答实际上给出了真正的原因:向后兼容已编写的代码。现在,有哪些“其他形状和形式”的bool在大量代码中被使用? - pmor
@pmor - 我曾在一家商店工作,他们有自己的基本const头文件,其中包含 typedef int bool; - 这在整个 C90 代码库中都很常见。基本上,许多地方都会像这些 https://dev59.com/hnI-5IYBdhLWcg3wTWdu 中的一个那样做。 - StoryTeller - Unslander Monica
感谢提供示例。当然,这个问题以前已经被问过了,但是:为什么不从一开始就将“bool”类型标准化(C89)呢?(这样人们就不必一遍又一遍地重新定义它了。) - pmor
@pmor - 在标准化之前,C语言已经广泛使用了十多年。第一个标准很可能旨在成为人们可以采用的共同基线。它也不能在那时添加。 - StoryTeller - Unslander Monica

4

通常的做法一直是使用 bool,但当该类型在C99标准中正式引入时,他们不希望破坏“自己编写”的实现方式。因此,他们将类型_Bool作为非官方bool的一种hack。现在不存在类型名称冲突了。总之,要使用bool,除非有遗留代码库需要修改。


4
它们是相同的。 bool_Bool 的别名。 在 C99 之前,我们没有这种类型。(早期使用仅限于将 0 视为 false 和 1 视为 true 的整数类型)。
你可能不会使用它。即使你可以 undef bool(但不建议这样做)。但包含它(stdbool.hbool 别名 _Bool)是好的,因为如果有一天它成为保留字,你的代码也符合规定。1 1.你可以以其他方式使用 bool,但最好不要这样做。因为通常当引入此 stdbool.h 时,它承载逐渐使其成为标准的计划,然后甚至更严格的规则适用,我们无法将 bool 用作其他内容,它将被保留为关键字


我知道它们是一样的...这就是为什么我问的原因。我会编辑我的问题以澄清。 - CIsForCookies
@CIsForCookies:我刚想说,你可以使用bool的其他方式,但最好不要这样做。因为通常情况下,当引入stdbool.h时,它的计划是逐渐使其成为标准,然后更严格的规则将适用,我们不能将bool用作其他东西,它将被保留为关键字。 - user2736738
1
如果你在C90代码中使用了_Bool,那么你是在作弊,因为该名称被保留供实现使用。在C99之前,标准C没有布尔类型;最接近的近似类型是一个整数类型,其中零表示false,任何非零值表示true。 - Jonathan Leffler
@JonathanLeffler:好的,我明白了。所以在_Bool引入之前它并不存在,而现在它已经被引入了。但是我看到有些代码使用了它,也许这是违反惯例的用法?我现在已经进行了编辑。 - user2736738

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接