我可以在各种编译器上使用 pragma pack 来强制结构具有不在其自然对齐方式上的字段。
这是递归的吗 - 所以假设 struct typedef A 包含 typedef struct B 的字段。如果使用 pragma 来打包 A,这会强制打包 struct B 吗?
最佳答案
你必须希望不会!假设您有一个接受参数结构 A 的函数:
void fn( struct A x ) ;
然后是一个包含结构 A 作为成员的压缩结构 B:
#pragma pack(1)
struct B
{
struct A a ;
}
如果您将 B 的成员 a 传递给 fn(),则该函数不知道该实例中的打包,并且会失败。
尽管有其他回答者的结果,我还是在 VC++ 2010 上执行了以下测试:
struct A
{
int a;
char b;
int c ;
} ;
struct B
{
struct A d ;
} ;
#pragma pack(1)
struct C
{
struct A d ;
} ;
#pragma pack(1)
struct D
{
int a;
char b;
int c ;
} ;
#pragma pack(1)
struct E
{
struct D ;
} ;
int main()
{
int a = sizeof(struct A) ;
int b = sizeof(struct B) ;
int c = sizeof(struct C) ;
int d = sizeof(struct D) ;
int e = sizeof(struct E) ;
}
在调试器中检查 main() 中的 a、b、c、d 和 e:
- a = 12
- b = 12
- c = 12
- d = 9
- e = 9
struct C
的打包对其 struct A 成员的大小没有影响。
关于C结构填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4128061/