Область применения директивы пакета прагмы в Visual Studio

Какова сфера действия #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

Вот почему я немного удивлен и очень ценю любое объяснение, которое вы можете дать.

8

Решение

То, что он «вступает в силу в первой структуре», не означает, что его действие ограничено этой первой структурой. #pragma pack работает обычным образом для директивы препроцессора: она длится «бесконечно» с точки активации, игнорируя любые области уровня языка, то есть ее эффект распространяется до конца единицы перевода (или пока не будет переопределен другой #pragma pack).

5

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

Он вступает в силу при первом объявлении структуры, объединения или класса после просмотра прагмы и действует до первого обнаруженного пакета #pragma (pop) или другого пакета #pragma (push), который продолжается до его аналога pop.

(толчки и хлопки обычно идут парами)

5

Вам следует позвонить #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));
}
3
По вопросам рекламы [email protected]