编译时间检查#pragma包的使用情况

时间:2018-10-10 02:32:15

标签: c++ c++11 compile-time pragma-pack

大多数编译器支持使用Dispose指令来更改类的包装,其中FD_CLOSE是每个成员新的最小可接受对齐方式。

是否可以在编译时检查是否已指定#pragma pack(N)。另外,有没有办法确定N

1 个答案:

答案 0 :(得分:2)

您不能直接测试结构打包,而是必须创建一个测试结构并检查其大小:

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结构的大小取决于定义它的位置(标头,代码文件等)。

缺点是,如果要在同一上下文中进行多次打包检查,则必须定义不同的结构(如果要使用,则需要定义宏)。