程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 關於#pragma push_macro("new") .

關於#pragma push_macro("new") .

編輯:C++入門知識

在三方庫源碼中,我們經常看到這樣的代碼:

#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。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved