2012-3-30
昨天小贤对#pragma算是有了一瞥,这瞥了一下还得继续瞥。昨天瞥出来#pragma的作用是“编译指示”,这就注定了在今后的N多瞥中#pragma都是与编译器有关的,只要是把握住这个主线,我们对#pragma就不用再“犹抱琵琶半遮面”的了,今天我就决定直接将其衣服“撕下”,(*^__^*)相当邪恶……
1.#pragmapack(参数)
这个昨天已经瞥过了,今天再瞥一下。 pack 为 struct, union和 class等的成员对齐指定字节边界.与编译器的 /Zp选项开关不同,它不针对整个项目,而仅针对模块,比如一个编译单元。
其实pack的参数相当之多,瞥之:
1)#pragma pack(n)
将当前字节对齐值设为 n
2)#pragma pack()
将当前字节对齐值设为默认值(通常是8) 。
3)#pragma pack(show)
以警告信息的形式显示当前字节对齐的值,不过本人一直没验证出来。
4)#pragma pack(push)、#pragma pack(pop)
之所以将push和pop选项放在一行,明显是有原因的。因为他们哥儿俩成对使用,push是将当前对齐的方式压栈,pop是将栈中的对齐方式弹出。请看大屏幕:
#pragma pack(push)
#pragma pack(1) //注意,此处开始了哟
struct test1
{
char a;
int b;
char c;
};
#pragma pack(pop)//注意,此处结束了哟
struct test2
{
char a;
int b;
char c;
};
int main()
{/*此处省略*/}
那么,你用test1定义的变量大小就是6,用test2定义的变量大小就是12。So easy
5)#pragma pack(push, n)
先将当前字节对齐值压入编译栈栈顶, 然后再将 n 设为当前值。
6)#pragma pack(pop, n)
将编译栈栈顶的字节对齐值弹出, 然后丢弃, 再将 n 设为当前值。
Pack还有其他的选项,但是我不想再看下去了,先放一放,喝杯咖啡。