您的位置:首页 > 运维架构

#pragma push_macro #pragma pop_macro和#pragma pack的用法

2009-12-12 12:47 393 查看
#pragma push_macro("macro_name")是把macro_name宏的值压入堆栈,而利用#pragma pop_macro("macro_name")来把macro_name宏的值pop出,这里看一个例子
#include <iostream>
using namespace std;

#define X 1
#define Y 2

int main(void){
cout<<X<<endl;//1
cout<<Y<<endl;//2
#pragma push_macro("X")
#define X 3
cout<<X<<endl;//3
#pragma pop_macro("X")
cout<<X<<endl;//1
return 0;
}


下面是#pragma pack(...)

一种简单的情况是#pragma pack(n)其中n的类型一般为int,他的用法一般和sizeof等关键字连用,详细使用见下:

#pragma pack(n)是用来来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数;

否则必须为n的倍数

穿插说明一下sizeof,见代码
#pragma  pack(4)//设定为4字节对齐

class  test_sizeof

{

char  one;

double two;

int  three;

};
cout<<sizeof(test_sizeof)<<endl;//result:16
///////////////////////////////////////////////////////
#pragma  pack(16)
class  test_sizeof

{

char one;

double two;

int three;

};
cout<<sizeof(test_sizeof)<<endl;//result:24
////以上为vs2008下的结果


还有一种#pragma pack()的用法就是如下用法
#pragma pack(4)    //以后的结构体默认对齐方式为4字节
#pragma pack(push,2)   //将4压栈,并且以后默认对齐为2
//...
#pragma pack(pop)     //将4出栈,并且以后的默认对齐为4
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: