Какова сфера действия #pragma pack
выравнивание в Visual C ++? Справочник по API
https://msdn.microsoft.com/en-us/library/vstudio/2e70t5y1%28v=vs.120%29.aspx
говорит:
Пакет вступает в силу при первом объявлении структуры, объединения или класса
после прагмы видно
Как следствие для следующего кода:
#include <iostream>
#pragma pack(push, 1)
struct FirstExample
{
int intVar; // 4 bytes
char charVar; // 1 byte
};
struct SecondExample
{
int intVar; // 4 bytes
char charVar; // 1 byte
};void main()
{
printf("Size of the FirstExample is %d\n", sizeof(FirstExample));
printf("Size of the SecondExample is %d\n", sizeof(SecondExample));
}
Я ожидал:
Size of the FirstExample is 5
Size of the SecondExample is 8
но я получил:
Size of the FirstExample is 5
Size of the SecondExample is 5
Вот почему я немного удивлен и очень ценю любое объяснение, которое вы можете дать.
То, что он «вступает в силу в первой структуре», не означает, что его действие ограничено этой первой структурой. #pragma pack
работает обычным образом для директивы препроцессора: она длится «бесконечно» с точки активации, игнорируя любые области уровня языка, то есть ее эффект распространяется до конца единицы перевода (или пока не будет переопределен другой #pragma pack
).
Он вступает в силу при первом объявлении структуры, объединения или класса после просмотра прагмы и действует до первого обнаруженного пакета #pragma (pop) или другого пакета #pragma (push), который продолжается до его аналога pop.
(толчки и хлопки обычно идут парами)
Вам следует позвонить #pragma pack(pop)
до SecondExample
#include <iostream>
#pragma pack(push, 1)
struct FirstExample
{
int intVar; // 4 bytes
char charVar; // 1 byte
};
#pragma pack(pop)
struct SecondExample
{
int intVar; // 4 bytes
char charVar; // 1 byte
};void main()
{
printf("Size of the FirstExample is %d\n", sizeof(FirstExample));
printf("Size of the SecondExample is %d\n", sizeof(SecondExample));
}