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

Jam*_*ris 16 c c++ boolean

我在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 */
Run Code Online (Sandbox Code Playgroud)

然后在任何使用_Bool的标头中

#ifdef __cplusplus
extern "C" {
#else
#include "mybool.h"
#endif

/* rest of header... */
Run Code Online (Sandbox Code Playgroud)

直到我意识到这将使用一个布尔(C _Bool)数据类型编译库,并使用另一个(C++ bool)链接库.实际上,这可能无关紧要,但从理论上讲,它可能确实存在(可能会有一些模糊的系统,这样做会导致宇宙向内翻).

我想我可以使用一个int并使用0表示false,将1表示为true,并使用类似的方法对其进行类型设置typedef int mybool,但它似乎没有吸引力.

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

Ant*_*ams 11

如果您使用的C和C++编译器来自同一个供应商,那么我希望C _Bool与C++的类型相同bool,并且包括<stdbool.h>将使一切都很好地互操作.如果他们来自不同的供应商,那么您需要检查兼容性.

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


AnT*_*AnT 6

形式上,这个问题没有解决方案。类型_Bool仅存在于 C 中。C++ 语言不提供任何类型来保证与_Bool. C++bool不保证兼容。

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

  • 我怀疑 `int` 或 `char` _guaranteed_ 在 C 和 C++ 之间兼容。在编译器的文档中可以说是正确的,但通常这个断言是错误的。如果文档说明兼容 `int`s,我不明白为什么它不应该对 `bool` 说同样的话。 (3认同)

Jam*_*ris 3

#include <stdbool.h>和用bool

  • @AndreyT:似乎没有任何保证 C `int` 与 C++ `int` 兼容。“从 C++ 到其他语言定义的对象以及从其他语言到 C++ 定义的对象的链接是实现定义的和语言相关的。只有两种语言实现的对象布局策略足够相似,才能实现这种链接。”。我希望 C 和 C++ 编译器能够一起使用(例如 gcc 和 g++),以使它们的“bool”和“int”类型等兼容。 (10认同)
  • 你的问题仍然完全有效,因为C99的“bool”只是#define的“_Bool”的别名,并且它是否与C++的“bool”兼容的问题确实是一个相关的问题。因此,我反对你的自我回答。:) (4认同)
  • @NeilRoy:看看OP的用户名。现在查看答案的用户名。现在看看答案的发布日期。现在问问自己,你的粗鲁评论是否起到了作用。 (2认同)