_Bool和bool:如何解决使用_Bool的C库的问题?

时间:2010-08-20 09:57:19

标签: c++ c boolean

我在C中编写了一组数据结构和函数,其中一些使用_Bool数据类型。当我开始时,该项目将是纯粹的C.现在我正在研究使用基于C ++的GUI工具包,并将后端代码放入库中。

但是,在编译C ++ GUI时,编译器会发出以下错误:

ISO C++ forbids declaration of '_Bool' with no type

我最初认为我可以搜索&将_Bool替换为bool并创建:

/* mybool.h */
#ifndef MYBOOL_H
#define MYBOOL_H

typedef _Bool bool;

#endif /* MYBOOL_H */

然后在任何使用_Bool

的标头中
#ifdef __cplusplus
extern "C" {
#else
#include "mybool.h"
#endif

/* rest of header... */

直到我意识到这将使用一个布尔(C _Bool)数据类型编译库,并使用另一个(C ++ bool)链接库。实际上,这可能无关紧要,但从理论上讲,它可能确实存在(可能会有一些模糊的系统,这样做会导致宇宙内外翻转)。

我想我可以使用一个int并使用0表示false,使用1表示true,并使用类似typedef int mybool的类型对其进行排序,但它似乎没有吸引力。

有没有更好/惯用/标准的方法来做到这一点?

5 个答案:

答案 0 :(得分:11)

如果你使用的C和C ++编译器来自同一个供应商,那么我希望C _Bool与C ++ bool的类型相同,包括<stdbool.h>的那个使一切都很好地互操作。如果他们来自不同的供应商,那么您需要检查兼容性。

注意,您始终可以在标头中测试__cplusplus宏,以确定代码是否正在编译为C ++,并正确设置类型。

答案 1 :(得分:4)

只需#include <stdbool.h>并使用bool

答案 2 :(得分:4)

正式来说,这个问题没有办法解决。类型_Bool仅存在于C语言中.C ++语言不提供任何可保证与_Bool的二进制兼容性的类型。 C ++ bool不保证兼容。

正确的解决方案是不要在C函数的参数声明中使用bool_Bool,这些函数可以直接从C ++代码访问(即可链接)。使用intchar或任何其他保证兼容的类型。

答案 3 :(得分:2)

我认为必须在任何项目中使用bool,以便在必要时与C ++兼容。

C99中的数据类型_Bool的存在是为了避免与可能存在的bool版本冲突,这些版本可能是在标准C99之前定义的。 因此,程序员可以选择更好的方式来调整他们的旧C程序以迁移到新标准。 因此,我认为使用单词bool是C99标准化委员会的真正愿望,但它被迫通过定义丑陋的单词_Bool来围绕不兼容问题。 这表明程序员可能不得不在他/她的项目中使用“预期”单词bool。在程序中声明布尔类型是最合乎逻辑的词。

在某些情况下,保持程序员预先存在的bool定义可能是个好主意,在其他情况下,最好使用bool中定义的<stdbool.h>版本。 程序员必须决定在每种情况下哪些更好,并且可能考虑逐渐迁移到<stdbool.h>是否是一个很好的行动。

如果您从零开始一个项目,那么可能最好的方法是使用bool中定义的<stdbool.h>

答案 4 :(得分:-5)

对您的C和C ++代码使用typedef int _Bool。如果将_Bool定义为其他任何内容,我会感到惊讶。