带有push和pop vs unpack的#pragma pack()

时间:2015-09-16 08:30:07

标签: c pragma

我有以下示例程序

#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 个答案:

答案 0 :(得分:2)

您的编译器对unpack() pragma一无所知,只是忽略它,因此相同的打包规则将应用于这两种结构。

MSVC编译器将在第一个警告级别发出有关未知#pragma指令的警告。

默认情况下,GCCClang都会保持静音。您需要使用-Wunknown-pragmas标志。