设为首页 加入收藏

TOP

关于#pragma push_macro("new") .
2015-11-21 01:17:22 来源: 作者: 【 】 浏览:3
Tags:关于 #pragma push_macro " new"

在三方库源码中,我们经常看到这样的代码:

#pragma push_macro("new")

#undef new

// do something with new

......

#pragma pop_macro("new")

它的作用就是将宏定义new压入栈并取消它(指的是宏)的定义,如此一来,new的本来含义便获得了恢复,使用完毕后将宏定义new弹出栈,恢复宏定义。

不过,仍有下面两个问题需要回答。

1)宏定义名不会与关键字new冲突吗?

2)宏定义new有何作用?

问题1

??? 宏定义名若与保留的关键字相同,编译器并不会提示错误,而是用最新定义的宏定义代替关键字发挥作用。下面是一个例子,定义了宏int。例程能顺利通过编译链接,其运行结果为8,4,8,与预期相同。

[cpp]
// ConsoleTest.cpp : 定义控制台应用程序的入口点。??
//??
?
#include "stdafx.h"??
#include ??
using namespace std;?
#define int double??
?
void _tmain(int argc, _TCHAR* argv[])?
{?
??? int iOne = 1;?
??? cout< ??? #pragma push_macro("int")??
??? #undef int??
??? int iTwo = 2;?
??? cout< ??? #pragma pop_macro("int")??
?
??? int iSecond=2;?
??? cout< ??? system("pause");?
}?

// ConsoleTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include
using namespace std;
#define int double

void _tmain(int argc, _TCHAR* argv[])
{
?int iOne = 1;
?cout< ??? #pragma push_macro("int")
??? #undef int
?int iTwo = 2;
?cout< ??? #pragma pop_macro("int")

?int iSecond=2;
?cout< ?system("pause");
}


?

解析:运行结果为8 ,4,8

??????? 宏定义,如#define PI 3.1415926?? 把程序中出现的PI全部换成3.1415926

??????? #define int double?? 该句话表明,把程序中出现int的地方全部替换为double ,(int iOne = 1;cout<

?

#pragma push_macro("int")

#undef intint iTwo = 2;

cout<

#pragma pop_macro("int")

??????
上面几句的意思是,将将宏定义int压入栈并取消它(指的是宏)的定义,如此一来,int的本来含义便获得了恢复,即int仍代表int。使用完毕后将宏定义int弹出栈,恢复宏定义即int代表double。

?

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Pascal's Triangle II 下一篇HDU 1160 FatMouse's Speed

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: