现在的位置: 首页 > 综合 > 正文

再谈#pragma

2013年10月12日 ⁄ 综合 ⁄ 共 837字 ⁄ 字号 评论关闭

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还有其他的选项,但是我不想再看下去了,先放一放,喝杯咖啡。

抱歉!评论已关闭.