Область применения директивы пакета прагмы в Visual Studio
Какова сфера действия #pragma pack
выравнивание в Visual C++? Ссылка на API https://msdn.microsoft.com/en-us/library/vstudio/2e70t5y1%28v=vs.120%29.aspx гласит:
Пакет вступает в силу при первом объявлении struct, union или class после того, как прагма видна
Как следствие для следующего кода:
#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
Вот почему я немного удивлен и очень ценю любое объяснение, которое вы можете дать.
3 ответа
То, что он "вступает в силу в первой структуре", не означает, что его действие ограничено этой первой структурой. #pragma pack
работает типично для директивы препроцессора: она длится "бесконечно" с момента активации, игнорируя любые области уровня языка, то есть ее эффект распространяется до конца единицы перевода (или до тех пор, пока не будет переопределен другой #pragma pack
).
Он вступает в силу при первом объявлении struct, union или class после просмотра прагмы и действует до первого обнаруженного пакета #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));
}