我有一个结构:
struct foo {
struct {
int a;
int b;
long len;
unsigned short c;
unsigned short d;
};
char payload[1024];
} bar;
我想在配置时找出是否需要插入填充以使'payload'双重对齐。
Autoconf提供AC_CHECK_SIZEOF(type)
和AC_CHECK_ALIGNOF(type)
,但我真正需要的是AC_CHECK_OFFSETOF(type, member)
。如果报告的偏移量不是双重对齐的,我可以引入足够的填充来实现它。
我可以运行一个报告offsetof(struct bar, payload)
的小程序,但我不想在我的构建系统中引入运行时检查(我们不经常交叉编译)。
答案 0 :(得分:1)
您可以使用AC_COMPUTE_INT
:
AC_COMPUTE_INT([payload_offset], [offsetof(struct bar, payload)], ...)
但是,使用匿名联盟强制对齐可能会更容易:
struct foo {
struct {
int a;
int b;
long len;
unsigned short c;
unsigned short d;
};
union {
char payload[1024];
double dummy; /* for alignment */
};
} bar;
如果您不想使用联合,则可以计算填充:
struct foo {
struct header {
int a;
int b;
long len;
unsigned short c;
unsigned short d;
};
char padding[(alignof(double) - 1) - ((sizeof(struct header)
+ alignof(double) - 1) % alignof(double))];
char payload[1024];
} bar;
答案 1 :(得分:1)
使用zero length bitfield可以在没有autotool技巧的情况下解决此问题。
struct foo {
struct {
int a;
int b;
long len;
unsigned short c;
unsigned short d;
};
int64_t : 0; // or long long whatever integer type is sizeof(double)
char payload[1024];
} bar;
答案 2 :(得分:0)
我真的不认为autoconf可以告诉你,因为编译器决定是否添加填充是一个问题。所以我认为唯一合理的方法是编译一个程序来检查成员的偏移量是否等于你认为应该相等的值。