确保C ++类符合我对数据成员布局的期望的最佳方法是什么?
我需要使用第三方图书馆的课程。我知道这个类是standard_layout
,我知道它包含某些公共数据成员(具体来说,我在这里谈论的是C结构)。但是,我不一定知道成员在结构中的排列顺序,我不知道是否有额外的数据成员。
我需要能够声明数据成员按特定顺序排列,并且没有额外的成员,因为我的目标是将此结构放在一个联合中并使用9.2中关于公共初始的特殊规则联盟的序列。最好,我希望这是某种类型的static_assert
,但使用小型测试程序检查构建系统也是可以接受的。
我正在考虑使用ofssetof
宏来检查成员的顺序,但我对如何确保填充中没有隐藏其他成员感到有些不知所措。
修改
我想重新解释这个问题的方法是:
答案 0 :(得分:2)
使用offsetof
,您可能知道该成员的顺序(和偏移)。
使用sizeof
,您可能知道结构和每个成员的大小。
但是如果struct
有填充,我就没有看到任何检测方法是否有额外的参数。
struct S
{
char c;
// char padding[3];
uint32_t u;
};
static_assert(offsetof(struct S, c) == 0, "expected c at 0");
static_assert(offsetof(struct S, u) == 4, "expected u at 4");
static_assert(offsetof(struct S, c) < offsetof(struct S, u), "expected c before u");
static_assert(sizeof(struct S) == 8, "expected size == 8");
static_assert(sizeof(struct S) - (sizeof(S::c) + sizeof(S::u)) == 3, "expected 3 bytes of padding");
所以:
是的,你可以知道订单。
是的,如果没有填充。