2010-08-20 59 views
13

我已经写了一个C的数据结构和函数的集合,其中一些使用_Bool数据类型。当我开始的时候,这个项目将变成纯粹的C.现在我正在研究使用一个基于C++的GUI工具包,并将后端代码放到一个库中。_Bool和bool:我如何解决使用_Bool的C库的问题?

然而,编译的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++布尔)链接库。实际上,这可能并不重要,但从理论上讲,它可能确实存在(可能会有一些不太明确的系统,这样做会导致宇宙内部出现)。

我想我可以只使用一个int,并使用0作为false,使用1作为true,并使用类似于typedef int mybool的typedef,但它看起来没有吸引力。

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

+1

做出该评论的答案,'布尔'是如何'_Bool'是如何正常使用。 – 2010-08-20 10:12:11

+1

所以我不需要担心宇宙内外翻转? – 2010-08-20 10:41:21

回答

5

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

+5

哑巴屁股:(形容词)非常不智能。 (连字符,见“屁股”)。你的意思是说,相比之下,你更聪明,因为你知道应该包括#include 在C中使用bool。我不敢说我​​对你的答案的看法。 – 2010-08-20 10:40:45

+9

为什么是的,与我笨拙的自我形成对比,当然我更聪明。 – 2010-08-20 10:58:35

+0

接受我自己的回答,并决定自称为傻瓜(因为在**在stackoverflow.com上提问时没有意识到答案**)。 – 2010-08-24 07:11:48

-4

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

+8

_Bool是C99本机类型。 – 2010-08-20 10:02:49

+0

因此你不能。 – 2010-08-20 10:10:12

+1

@JamesMorris:它不仅是本机类型,它的名称是一个关键字(假设C编译器支持C99或更高版本)。 – 2013-06-07 01:27:37

11

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

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

+0

我总是可以在我的头文件中测试__cplusplus宏......嗯,好吧,发现了。 – 2010-08-24 07:08:16

+0

http://stackoverflow.com/questions/25461/interfacing-with-stdbool-hc是一个他们不兼容的例子,虽然这个问题存在一个不好的非编译器提供的'stdbool.h'头。 – 2013-01-06 04:32:59

1

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

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

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

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

3

形式上,这个问题没有解决方案。类型_Bool仅在C中存在。C++语言不提供任何类型,以确保与_Bool的二进制兼容性。不保证C++ bool兼容。

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

+2

我怀疑'int'或'char' _guaranteed_在C和C++之间是兼容的。可以说在编译器的文档中是正确的,但总的来说这个断言是错误的。如果文档说明兼容'int's,我不明白为什么它不应该说'bool'。 – magras 2016-07-26 12:22:12