什么是网络编程中的`#pragma pack`?

时间:2011-06-15 04:36:01

标签: c++ pragma-pack

 #pragma pack(push)
 #pragma pack(1)

我下载了一个教程,它在头文件中有这些行。 如果你们能为我提供与此相关的任何教程或参考资料,我将不胜感激。

3 个答案:

答案 0 :(得分:3)

微软的解释:

http://msdn.microsoft.com/en-us/library/aa273913(v=vs.60).aspx

IBM的AIX xlC解释:

http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Fcompiler%2Fref%2Frnpgpack.htm

基本上,它确定存储结构或联合时将使用的字节边界。 push / pop用作在堆栈上存储和检索这些设置的方法。

为了将来参考,您可以通过在网络上搜索您要求的关键字来节省一些时间。我所做的就是在http://www.google.com

搜索“pragma pack”

答案 1 :(得分:2)

所有#pragma语句都是特定于供应商的。

这是Microsoft特定的,并描述了编译器可以添加到struct多少“打包”(以字节为单位)以便更好地对齐。

#pragma pack(push)只是在堆栈中保存和先前的设置。然后,您可以更改某个代码块的打包条件,稍后更改#pragma pack(pop)以恢复以前的设置。

答案 2 :(得分:1)

这是MSVC ++特定的打包说明符。您可以从the documentation确切了解它的作用。

打包更改允许编译器在给定结构(或类)的数据成员之间插入以保持对齐的填充量。对于网络代码,可能正在使用#pragma pack说明符,以便可以将结构转换为char*void*以传递给某个网络API,以发送整个立即在网络上构建。

(注意这是不安全的,因为不同的机器对齐和字节顺序有不同的规则;这只有在线路两端的两台机器使用相同的硬件类型时才有效)

相关问题