Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Scope of the pragma pack directive in Visual Studio

What is the scope of the #pragma pack alignment in Visual C++? The API reference https://msdn.microsoft.com/en-us/library/vstudio/2e70t5y1%28v=vs.120%29.aspx says:

pack takes effect at the first struct, union, or class declaration after the pragma is seen

So as a consequence for the following code:

#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));
}

I've expected:

Size of the FirstExample is 5
Size of the SecondExample is 8

but I've received:

Size of the FirstExample is 5
Size of the SecondExample is 5

That is why I am a little surprised and I really appreciate any explanation you can provide.

like image 694
rgb Avatar asked Jun 24 '15 19:06

rgb


3 Answers

Just because it "takes effect at the first struct" does not mean that its effect is limited to that first struct. #pragma pack works in a typical way for a preprocessor directive: it lasts "indefinitely" from the point of activation, ignoring any language-level scopes, i.e. its effect spreads to the end of translation unit (or until overridden by another #pragma pack).

like image 153
AnT Avatar answered Sep 24 '22 08:09

AnT


You should call #pragma pack(pop) before 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));
}
like image 27
JamesWebbTelescopeAlien Avatar answered Sep 26 '22 08:09

JamesWebbTelescopeAlien


It takes effect at the first struct, union, or class declaration after the pragma is seen and lasts until the first encountered #pragma pack(pop) or another #pragma pack(push) which last to its pop-counterpart.

(push and pops usually come in pairs)

like image 27
engf-010 Avatar answered Sep 23 '22 08:09

engf-010