当前位置:C++技术网 > 资讯 > #pragma pack是什么

#pragma pack是什么

更新时间:2015-06-24 16:11:24浏览次数:1+次

    #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) 将之前保存的对齐方式来覆盖临时的设置从而恢复原先的设置。

    注意:如果我们不用这些指令将需要的结构体包含,就使用的是IDE设置的。
    两组的区别说明:
    第一组直接设置对齐方式,如果不使用取消指令,则之后的结构体等都按照设置的进行对齐。直到取消指令为止,才恢复到IDE的设置。这组只支持单一的设置。
    第二组则是使用栈来存储对齐设置。将自己需要的设置到栈顶,当前对齐方式就按照栈顶的对齐方式来设置,如果忘记取消,则也一直按照栈顶指定的方式处理。当然要记住取消,恢复之前的方式。第二组可以支持多种对齐方式,就是对齐方式嵌套。但是记得每次需要释放,和循环嵌套类似。释放后就使用前一个设置,以此类推。