编译时检查#pragma pack 的使用情况
Compile time check for usage of #pragma pack
大多数编译器支持使用 #pragma pack(N)
指令更改 class 的打包,其中 N
是每个成员可接受的新的最小对齐方式。
是否可以在编译时检查是否指定了 #pragma pack(N)
。此外,有没有办法确定 N
?
您不能直接测试结构包装,而是必须创建一个测试结构并检查其大小:
struct Test_Pack_Struct {
unsigned char bVal;
__int64 lVal;
};
#define GetStructPacking() (sizeof(Test_Pack_Struct)-8)
在编译时,您可以使用静态断言检查适当的大小(需要 C++ 11 或更高版本),例如:
static_assert( GetStructPacking() == 4, "Error: 4 byte packing assumed" );
在运行时,您可以将 GetStructPacking 宏的值分配给变量或在表达式中使用它:
int iPacking = GetStructPacking()
请记住,Test_Pack_Struct 结构的大小取决于定义它的位置(头文件、代码文件等)。
一个缺点是,如果你想在同一个上下文中进行多个包装检查,你必须定义不同的结构(如果你想使用它,还必须定义宏)。
大多数编译器支持使用 #pragma pack(N)
指令更改 class 的打包,其中 N
是每个成员可接受的新的最小对齐方式。
是否可以在编译时检查是否指定了 #pragma pack(N)
。此外,有没有办法确定 N
?
您不能直接测试结构包装,而是必须创建一个测试结构并检查其大小:
struct Test_Pack_Struct {
unsigned char bVal;
__int64 lVal;
};
#define GetStructPacking() (sizeof(Test_Pack_Struct)-8)
在编译时,您可以使用静态断言检查适当的大小(需要 C++ 11 或更高版本),例如:
static_assert( GetStructPacking() == 4, "Error: 4 byte packing assumed" );
在运行时,您可以将 GetStructPacking 宏的值分配给变量或在表达式中使用它:
int iPacking = GetStructPacking()
请记住,Test_Pack_Struct 结构的大小取决于定义它的位置(头文件、代码文件等)。
一个缺点是,如果你想在同一个上下文中进行多个包装检查,你必须定义不同的结构(如果你想使用它,还必须定义宏)。