#pragma pack() 推和弹出 vs 解包
#pragma pack() with push and pop vs unpack
下面有这个示例程序
#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
您的编译器对 unpack()
编译指示一无所知,只是忽略它,因此相同的打包规则应用于两个结构。
MSVC
编译器将在第一个警告级别发出关于未知 #pragma
指令的警告。
GCC
和Clang
都默认保持静音。您需要使用 -Wunknown-pragmas
标志。
下面有这个示例程序
#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
您的编译器对 unpack()
编译指示一无所知,只是忽略它,因此相同的打包规则应用于两个结构。
MSVC
编译器将在第一个警告级别发出关于未知 #pragma
指令的警告。
GCC
和Clang
都默认保持静音。您需要使用 -Wunknown-pragmas
标志。