我可以在各种编译器上使用pragma pack来强制结构具有不在其自然对齐上的字段.
这是递归的 - 所以假设struct typedef A包含typedef struct B的字段.如果使用pragma打包A将强制结构B打包?
只是不要.如果没有指定您正在使用的确切平台/编译器,您甚至可以询问有关丑陋的非标准扩展的确切行为.如果您发现自己需要打包结构,那么最好弄明白为什么代码被破坏并修复它.打包的结构是破坏代码的创可贴,无法解决破坏的根本原因.
你不得不希望!假设你有一个带参数struct A的函数:
void fn( struct A x ) ;
Run Code Online (Sandbox Code Playgroud)
然后是一个包含结构A作为成员的压缩结构B:
#pragma pack(1)
struct B
{
struct A a ;
}
Run Code Online (Sandbox Code Playgroud)
如果将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) ;
}
Run Code Online (Sandbox Code Playgroud)
检查调试器中main()中的a,b,c,d和e产量:
包装struct C对其struct A成员的大小没有影响.