8

假设我有一个结构:

struct A {
  uint16_t a;
  uint64_t b;
};

有没有办法获得 A w/o padding 的大小?ie:所有成员的sizeof之和(即使它不是递归的)。

通常sizeof(A) == 16. 我愿意__GCC_sizeof__(A) == 10

我希望它在一个不影响实际代码的测试代码中,这意味着结构定义中没有"#pragma"s 和 no "__attribute__"。(虽然可以用 来完成#ifdef TEST,但是很丑)。

它不必是便携式的,GCC就足够了。

谢谢!

4

4 回答 4

5

我认为sizeof(A::a) + sizeof(A::b)应该为您解决问题。没有办法获得结构的未填充大小,因为这样的大小可以为程序服务的目的是什么?

于 2013-01-17T14:34:53.000 回答
3

目的是能够从测试内部跟踪新添加的结构成员。

如果你先问这个会更好......

答案是肯定的,有办法,但不是靠#include文件;您应该使用能够获取 AST/ABT 结构并列出字段然后将其与预先注册的列表进行比较的东西。例如,Clang 可以做到这一点。


但是现在,让我们更进一步。你为什么要测试它?它很脆!

最好测试一下功能,隐藏的东西是有原因的。

如果每个功能都经过正确测试,那么只要测试通过,您是否知道字段列表就无关紧要了。

于 2013-01-17T18:41:24.270 回答
2

我会看看这个 Stackoverflow 响应:

gcc 的 __attribute__((packed)) / #pragma pack 不安全吗?

并在此网站上获取 GCC 信息:

http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html

如果将结构之前的编译指示设置为 1,它应该在字节边界上对齐并且是紧凑的大小,因此您可以使用 sizeof 来获取字节数。

如果只是少量结构,可以在结构声明前启用pragma,之后再禁用。

希望about对您的工作有所帮助。

于 2013-01-17T14:34:01.927 回答
0

在 C 语言中,您可以使用预处理器指令#pragma来检查sizeof结构而无需填充..

#pragma pack(1)  

会给你sizeof没有填充的结构..

于 2013-01-17T15:27:10.853 回答