#pragma pack () с push и pop vs распаковать

у меня есть этот пример программы ниже

#include <stdio.h>                              
#include <stdlib.h>

#pragma pack(push)
#pragma pack(1)
typedef struct{
  char a;
  int b;
  char c;
}st_a;
#pragma pack(pop)

typedef struct{
  char a;
  int b;
  char c;
}st_b;


int main()
{
  printf("size of struct a %zd n",sizeof(st_a));
  printf("size of struct b %zd n",sizeof(st_b));

  return 0;
}

выход вышеуказанной программы

size of struct a 6 
size of struct b 12 

теперь, если я изменю объявление структуры, как показано ниже:

#pragma pack(1)
typedef struct{
  char a;
  int b;
  char c;
}st_a;
#pragma unpack()

вывод программы

size of struct a 6 
size of struct b 6 

почему это различие в поведении? Я понимал, что обе декларации структуры делают одно и то же.

я запускаю это на своем MBP.

$gcc --version 

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.4.0
Thread model: posix

1 ответов


свой компилятор ничего не знает о unpack() pragma и просто игнорирует его, поэтому одни и те же правила упаковки применяются к обеим структурам.

MSVC компилятор выдаст предупреждение о неизвестных #pragma директивы на первом уровне предупреждения.

и GCC и Clang хранить молчание по умолчанию. Вам нужно использовать -Wunknown-pragmas флаг.