在设计要通过连接C和C++代码的C API传递的数据结构时,使用bool是否安全?也就是说,如果我有这样的struct:

struct foo {
  int bar;
  bool baz;
};

是否可以保证C(在baz中)和C++以相同的方式解释foo的大小和含义及其在_Bool中的位置?

我们正在考虑在单个平台(Beaglebone上的Debian 8的GCC)上使用相同的GCC版本(分别为C99和C++ 11)编译的C和C++代码执行也欢迎一般评论

最佳答案

C和C++的bool类型不同,但是,只要您使用相同的编译器(在您的情况下为gcc),它就应该是安全的,因为这是一个合理的常见情况。

在C++中,bool一直是关键字。 C直到C99都没有,他们引入了关键字_Bool(因为人们习惯于在C89代码中将def或#define bool键入为intchar,因此直接添加bool作为关键字会破坏现有代码);有一个 header stdbool.h,在C语言中应具有typedef或#define,从_Boolbool。看你的GCC的实现如下所示:

/*
 * ISO C Standard:  7.16  Boolean type and values  <stdbool.h>
 */

#ifndef _STDBOOL_H
#define _STDBOOL_H

#ifndef __cplusplus

#define bool        _Bool
#define true        1
#define false        0

#else /* __cplusplus */

/* Supporting <stdbool.h> in C++ is a GCC extension.  */
#define _Bool        bool
#define bool        bool
#define false        false
#define true        true

#endif /* __cplusplus */

/* Signal that all the definitions are present.  */
#define __bool_true_false_are_defined        1

#endif        /* stdbool.h */

这使我们相信,至少在GCC中,这两种类型是兼容的(大小和对齐方式都一样,因此结构布局将保持不变)。

同样值得注意的是,在许多平台上的Itanium ABIwhich is used by GCC和大多数其他编译器(Visual Studio除外;正如下面的评论中Matthieu M.所指出的)指定_Boolbool遵循相同的规则。这是一个强有力的保证。我们可以从Objective-C's reference manual获得第三个提示,它表示对于分别尊重C和C++约定的Objective-C和Objective-C++,bool_Bool是等效的。因此,我几乎可以说,尽管标准不能保证这一点,但是您可以假设是的,它们是等效的。

编辑:

如果该标准不能保证_Boolbool兼容(大小,对齐方式和填充),那怎么办?

当我们说这些东西是“与架构有关的”时,实际上是指它们与ABI有关。每个编译器都实现一个或多个ABI,如果两个编译器(或同一编译器的版本)实现相同的ABI,则它们是兼容的。由于这是普遍存在的,因为它期望从C++调用C代码,所以我听说过的所有C++ ABI都扩展了本地C ABI。

由于OP询问了Beaglebone,因此我们必须检查ARM ABI,尤其是Debian使用的GNU ARM EABI。正如Justin Time在评论中所指出的,ARM ABI indeed declares C++'s ABI to extend C's, and that _Bool and bool are compatible均为1,对齐1,表示机器的无符号字节。因此,在Beaglebone上,问题的答案是是,_Boolbool是兼容的

关于c++ - 从C到C++再返回 bool ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40020423/

10-12 19:58