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

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

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

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

我最初认为我可以搜索并替换_Boolbool并创建:

 /* 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 ,但它似乎没有吸引力。

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

如果你使用的C和C ++编译器来自同一个供应商,那么我希望C _Bool与C ++ bool类型相同,包括在内的所有东西都可以很好地互操作。 如果他们来自不同的供应商,那么您需要检查兼容性。

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

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

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

只需#include 并使用bool

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

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

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

如果从零开始一个项目,那么最好的方法就是使用定义的bool

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