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