Проверка времени компиляции для использования #pragma pack - PullRequest
0 голосов
/ 10 октября 2018

Большинство компиляторов поддерживают изменение упаковки класса с помощью директивы #pragma pack(N), где N - это новое минимально допустимое выравнивание для каждого члена.

Можно ли проверить во время компиляции,или не указано #pragma pack(N).Кроме того, есть ли способ определить N?

1 Ответ

0 голосов
/ 10 октября 2018

Вы не можете напрямую протестировать упаковку структуры, вместо этого вам нужно создать тестовую структуру и проверить ее размер:

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 зависит от позиции, в которой она определена (заголовки, файлы кода и т. д.).

Недостатком является то, что если вы хотите выполнить несколько проверок упаковки в одном и том же контексте, вам необходимо определить различные структуры (и макросы, если вы хотите их использовать).

...