让我们假设我有一个结构:
struct A {
uint16_t a;
uint64_t b;
};
有没有办法获得A w / o填充的大小?即:所有成员的sizeof总和(即使它不是递归的)。
通常sizeof(A) == 16.
我想要__GCC_sizeof__(A) == 10
。
我希望它在测试代码中不影响实际代码,这意味着结构定义中没有"#pragma"
和"__attribute__"
。
(尽管可以使用#ifdef TEST
完成,但它非常难看。)
它不必是可移植的,GCC
就足够了。
谢谢!
答案 0 :(得分:5)
我认为sizeof(A::a) + sizeof(A::b)
应该为你做的伎俩。没有办法获得一个未填充大小的结构,因为这样的大小可以为一个程序服务的目的是什么?
答案 1 :(得分:3)
目的是能够从测试中跟踪新添加的结构成员。
如果你先问这个问题会更好......
答案是肯定的,有方法,但不是#include
文件;你应该使用能够获得AST / ABT结构的东西并列出字段,然后将它与预先注册的列表进行比较。例如,对于Clang来说,这是可能的。
但现在,让我们更进一步。你为什么要测试呢?它很脆弱!
最好测试功能,隐藏的内容是隐藏的。
如果每个功能都经过正确测试,那么只要测试通过,您是否知道字段列表就不重要了。
答案 2 :(得分:2)
我会看看这个Stackoverflow响应:
Is gcc's __attribute__((packed)) / #pragma pack unsafe?
并在此网站上获取海湾合作委员会的信息:
http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html
如果在结构之前将pragma设置为1,它应该在字节边界上对齐并且是一个紧凑的大小,因此您可以使用sizeof来获取字节数。
如果只是少量结构,可以在声明结构之前启用pragma,然后再禁用它。
希望这对你的努力有所帮助。
答案 3 :(得分:0)
在C语言中,您可以使用预处理程序指令#pragma
来检查sizeof
结构而不填充..
#pragma pack(1)
将为您提供sizeof
结构而不填充..