padded struct的实际大小,(成员大小的总和,没有用于对齐的填充)

时间:2015-03-26 22:19:02

标签: c linux visual-studio-2010 gcc

sizeof ()返回结构的大小,包括用于对齐的成员的填充。哪个好。不需要将结构打包为0填充。

只需要得到(或计算)要比较的结构成员大小的总和(在静态编译时断言中使用它)。

如果您的会员人数较少,他们的缺席/差异就不会被抓住。 成员主要是char数组

是否可以在编译时(或运行时)获取该数字?

或者我怎样才能确保'有效'尺寸符合我的预期并避免因制动程序而意外改变?

如果A或B被错误地修改为不同,则初衷是避免错误。 使用STATIC_ASSERT( sizeof(A)== sizeof(B)) 这不适用于填充造成的一些“小”差异。

注意:A和B应该类似,但在给定的设计中,不可能在程序的两个部分中重复使用A.此检查是为了确保某人只更改A或仅更改B,它无法编译。

1 个答案:

答案 0 :(得分:2)

你可以#include两次相同的标题。一旦启用打包,一次不打开。显然,宏也会将压缩结构的名称更改为与真实结构名称不同的内容。

这是一个例子。头文件,比如test.h,如下所示。它显示了两个具有不同拆包尺寸但包装尺寸相同的结构。

#ifdef ENABLE_PACKED
#define PACKED(x) __attribute__ ((__packed__)) x##_packed
#else
#define PACKED(x) x
#endif

struct PACKED(my_struct1) {
    char c1;
    int i1;
    char c2;
    int i2;
};

struct PACKED(my_struct2) {
    char c1;
    char c2;
    int i1;
    int i2;
};

#ifdef ENABLE_PACKED
_Static_assert(sizeof(struct my_struct1_packed) ==
               sizeof(struct my_struct2_packed), "Error");
#endif

#undef PACKED

请注意,您只需要在一个文件中定义ENABLE_PACKED和#include test.h,以便测试静态断言。所以你甚至可以创建一个包含test.h两次的dummy.c文件,每次都有你的构建编译dummy.c但实际上并没有在任何真正的发布对象中使用它。这样,所有真正的.c文件甚至根本不需要了解这一点,并且可以正常包含所有头文件。