Проверка времени компиляции для использования #pragma pack

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

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

0

Решение

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

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

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]