在三方库源码中,我们经常看到这样的代码:
#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,与预期相同。
// ConsoleTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
#define int double
void _tmain(int argc, _TCHAR* argv[])
{
int iOne = 1;
cout<<sizeof(iOne)<<endl;
#pragma push_macro("int")
#undef int
int iTwo = 2;
cout<<sizeof(iTwo)<<endl;
#pragma pop_macro("int")
int iSecond=2;
cout<<sizeof(iSecond)<<endl;
system("pause");
}
解析:运行结果为8 ,4,8
宏定义,如#define PI 3.1415926 把程序中出现的PI全部换成3.1415926
#define int double 该句话表明,把程序中出现int的地方全部替换为double ,(int iOne = 1;cout<<sizeof(iOne)<<endl;相当于iOne为double类型,所以输出8)
#pragma push_macro("int")
#undef intint iTwo = 2;
cout<<sizeof(iTwo)<<endl;
#pragma pop_macro("int")
上面几句的意思是,将将宏定义int压入栈并取消它(指的是宏)的定义,如此一来,int的本来含义便获得了恢复,即int仍代表int。使用完毕后将宏定义int弹出栈,恢复宏定义即int代表double。