在三方庫源碼中,我們經常看到這樣的代碼:
#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 <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");
}
// 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。