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

C++ _Bool和Bool:如何解决使用_Bool的C库的问题?,c++,c,boolean,C++,C,Boolean,我用C编写了一组数据结构和函数,其中一些使用了_Bool数据类型。当我开始时,这个项目将是纯C.,现在我正在使用基于C++的GUI工具包进行调查,并将后端代码变成了一个库。 但是,编译C++ GUI时编译器会发出以下错误: ISOC++禁止声明'BooL '没有类型< /COD> < /P> 我最初认为我可以搜索并替换\u Bool到Bool并创建: /* mybool.h */ #ifndef MYBOOL_H #define MYBOOL_H typedef _Bool bool;

我用C编写了一组数据结构和函数,其中一些使用了_Bool数据类型。当我开始时,这个项目将是纯C.,现在我正在使用基于C++的GUI工具包进行调查,并将后端代码变成了一个库。 <>但是,编译C++ GUI时编译器会发出以下错误:

<代码> ISOC++禁止声明'BooL '没有类型< /COD> < /P> 我最初认为我可以搜索并替换

\u 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,然后用
typedefintmybool
之类的东西来定义它,但它似乎没有吸引力


<是否有更好的/惯用的/标准的方法?

< p>使用C代码> TyPulfint int bOOL < /C> > C和C++代码。如果将布尔定义定义为其他任何东西,我会感到惊讶。

< P> >代码>包含< /C> >,使用<代码> BooL< /C> > < /P> < P>如果您使用的C和C++编译器来自同一个供应商,那么我希望C++代码> BooO</C> >与C++<代码> Boo.<代码>相同,包括
将使一切都可以很好地互操作。如果它们来自不同的供应商,那么您需要检查兼容性


<>注意,在测试中,你可以总是测试你的代码< >代码> pPLUS PLUS < /C++ >宏,以确定代码是否被编译为C++,并适当地设置类型。 C99中存在数据类型
\u Bool
,以避免与标准C99之前程序员可能定义的
Bool
的现有版本发生冲突。 因此,程序员可以选择更好的方法来调整他们的旧C程序,以便向新标准迁移。 因此,我认为使用
bool
这个词是C99标准化委员会的真正愿望,但它不得不通过定义丑陋的词
\u bool
来解决不兼容问题。 这表明程序员可能必须在其项目中使用“预期”单词
bool
。它是在程序中声明布尔类型最合乎逻辑的词

在某些情况下,最好保留程序员预先存在的
bool
定义,在其他情况下,最好使用
中定义的
bool
版本。 程序员必须决定在每种情况下什么更好,而且,也许,考虑到逐步迁移到<代码> <代码>是一个很好的行动。


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

从形式上讲,这个问题没有解决方案。类型<代码>布尔布尔< /COD>只存在于C++语言中,不提供任何类型的二进制兼容性,以保证与<代码>C++ >代码>布尔O/COD>不能保证兼容。< /P>

正确的解决方案不是在C++函数的参数声明中使用<代码> Boo.<代码>或<代码>β布尔> <代码>,它们的目的是直接从C++代码访问(即可链接)。使用

int
char
或保证兼容的任何其他类型

\u Bool是C99本机类型。@JamesMorris:它不仅是本机类型,它的名称是一个关键字(假设C编译器支持C99或更高版本)。请将该注释作为答案,
bool
是正常使用
\u bool
的方式。所以我不必担心宇宙会发生翻天覆地的变化?我可以随时测试标题中的u cplusplus宏。。。嗯,是的,不错。这是一个它们不兼容的例子,尽管问题是提供了一个坏的非编译器
stdbool.h
头。您的问题仍然完全正确,因为C99的“bool”只是一个定义的别名“_bool”,它是否与C++的“bool”兼容的问题确实是一个相关的问题。因此,我不赞成你的自我回答@詹姆斯·莫里斯:这个答案毫无意义。在C++代码中,BOOL 只是对C++代码的一种宏替代,在C++中它是C++特定类型。不能保证C++代码> <布尔O/C++ > vc++>代码> BOOL兼容。@安德烈:似乎没有任何保证,C<代码> int >代码>与C++ <代码> int >代码兼容。从C++到其他语言定义的对象,以及C++语言中的对象,都是由定义语言依赖的。只有在两种语言实现的对象布局策略足够相似的情况下,才能实现这种联系。我希望C和C++编译器可以一起使用(例如GCC和G++),使他们的<代码> BoOL 和 INT/COD>类型兼容。如果你不能回答自己而不侮辱你,那么你就不应该发布。@ NeilRoy:看看OP的用户名。现在看看答案的用户名。现在看看答案的发布日期。现在问问你自己,你的粗话是否能达到任何效果。我怀疑 int >代码>或代码> char < /C> >保证C和C++之间兼容。它可以在编译器文档中声明为true,但通常这个断言是false。如果文档声明兼容<代码> int <代码> s,我不明白为什么它不应该对< C++ >代码> >代码> @马格拉斯:不,C++最初是CeRa。