#pragma pack是什么

2553 人浏览 | 时间: 2015-06-24 16:11:24 | 作者: codexia

    #pragma是预处理指令,紧跟着的是参数,而pack参数指代的意思是数据打包,用途是设置数据的打包方式。package单词正好有包的意思。这样你也就好记住这条指令的大概含义。
    在各种协议处理时,将协议的字段封装成结构体来处理,就非常简单。但是数据的对齐方式又是一个大问题。这个指令#pragma pack正是解决数据对齐的。
    在使用结构体时,需要保持良好的编程习惯,可以提高效率。可以参考文章《关于成员对齐方式》。想了解对齐方式,请阅读《结构体对齐问题分析》。#pragma pack用于指定数据对齐方式。和手动修改IDE中的设置是一样的效果。在特定的地方,你可以使用这个指令来处理。预处理指令可以放置在任何地方,因为它在编译时就执行了,运行时不执行,而不仅限于头部。
    C/C++编译器中(其他的不清楚),使用方法如下:
    第一组:
    #pragma pack (n) // 按照n个字节对齐,使编译器按照手动写的对齐方式执行,忽略IDE中的设置
    #pragma pack ()  //  取消手动写指令设定的对齐方式,使用IDE设置中的对齐方式
    第二组:
    #pragma  pack (push,1) // 将之前的对齐方式设置压栈保存,设置新的对齐方式,临时设置,不破坏原始的设置,括号中第二个参数的数字即对齐的字节数
    #pragma pack(pop)      // 恢复使用#pragma  pack (push,X) 指令临时设置的对齐方式,恢复原来的对齐方式
 
    一般来说,建议使用第二组,这样不破坏原先设置,只需要设置自己的,用完就恢复。因为说不定有其他地方依赖原先的设置。
    需要注意的是,#pragma pack括号内部的逗号是作为一个顺序操作的作用,这是逗号的作用,学了C语言都知道。所以,我们也可以将#pragma  pack (push,1)  拆成两步,如下:
    #pragma pack(push) //保存之前的对齐方式
    #pragma pack(1)    //设置现在的对齐方式,按1字节对齐
    最后,应用完后,使用 #pragma pack(pop) 将之前保存的对齐方式来覆盖临时的设置从而恢复原先的设置。

请微信扫码阅读
为防止恶意爬虫,
已开启反爬机制

相关阅读