在设计要通过连接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
键入为int
或char
,因此直接添加bool
作为关键字会破坏现有代码);有一个 header stdbool.h
,在C语言中应具有typedef或#define,从_Bool
到bool
。看你的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 ABI,which is used by GCC和大多数其他编译器(Visual Studio除外;正如下面的评论中Matthieu M.所指出的)指定
_Bool
和bool
遵循相同的规则。这是一个强有力的保证。我们可以从Objective-C's reference manual获得第三个提示,它表示对于分别尊重C和C++约定的Objective-C和Objective-C++,bool
和_Bool
是等效的。因此,我几乎可以说,尽管标准不能保证这一点,但是您可以假设是的,它们是等效的。编辑:
如果该标准不能保证
_Bool
和bool
兼容(大小,对齐方式和填充),那怎么办?当我们说这些东西是“与架构有关的”时,实际上是指它们与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上,问题的答案是是,_Bool
和bool
是兼容的。关于c++ - 从C到C++再返回 bool ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40020423/