_Bool和bool:如何解决使用_Bool的C库的问题?
我在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
,但它似乎没有吸引力。
有没有更好/惯用/标准的方法来做到这一点?
如果你使用的C和C ++编译器来自同一个供应商,那么我希望C _Bool
与C ++ bool
类型相同,包括
在内的所有东西都可以很好地互操作。 如果他们来自不同的供应商,那么您需要检查兼容性。
注意,您始终可以在标头中测试__cplusplus
宏,以确定代码是否正在编译为C ++,并适当地设置类型。
从forms上讲,这个问题没有解决办法。 类型_Bool
仅存在于C语言中.C ++语言不提供任何可保证与_Bool
二进制兼容性的类型。 C ++ bool
不保证兼容。
正确的解决方案是不要在C函数的参数声明中使用bool
或_Bool
,这些函数可以直接从C ++代码访问(即可链接)。 使用int
, char
或任何其他保证兼容的类型。
只需#include
并使用bool
。
我认为必须在任何项目中使用bool
,以便在必要时与C ++兼容。
C99中的数据类型_Bool
的存在是为了避免与可能存在的bool
版本冲突,程序员可以在标准C99之前定义它们。 因此,程序员可以选择更好的方式来调整他们的旧C程序以迁移到新标准。 因此,我认为使用bool
这个词是C99标准化委员会的真正愿望,但它被迫通过定义丑陋的单词_Bool
来围绕不兼容问题。 这表明程序员可能不得不在他/她的项目中使用“预期”一词bool
。 在程序中声明布尔类型是最合乎逻辑的词。
在某些情况下,保持程序员预先存在的bool
定义可能是个好主意,在其他情况下,最好使用
定义的bool
版本。 程序员必须决定在每种情况下哪些更好,并且可能考虑逐步迁移到
是否是一个很好的行动。
如果从零开始一个项目,那么最好的方法就是使用
定义的bool
。
对你的C和C ++代码使用typedef int _Bool
。 如果将_Bool定义为其他内容,我会感到惊讶。