2017-07-31 71 views
1

#pragma pop_macro("int")

#include <iostream> 
using namespace std; 
#define int double 
void main() 
{ 
    int iOne = 1; 
    cout << sizeof(iOne) << endl; 
#pragma push_macro("int") 
#undef int 
    int iTwo = 2; 
    cout << sizeof(iTwo) << endl; 
#pragma pop_macro("int") 
} 

有無#pragma pop_macro( 「INT」)

#include <iostream> 
using namespace std; 
#define int double 
void main() 
{ 
    int iOne = 1; 
    cout << sizeof(iOne) << endl; 
#pragma push_macro("int") 
#undef int 
    int iTwo = 2; 

    cout << sizeof(iTwo) << endl; 
//#pragma pop_macro("int") 
} 

我剛纔試過vs2017,沒有什麼different.both沒有警告/錯誤,工作正常,並具有相同的輸出:如果#pragma push_macro沒有#pragma pop_macro會怎麼樣?


所以,我的問題是:

  • 爲什麼VS允許這種行爲?
  • 它是UB嗎?
+0

如果沒有「彈出」,初始#pragma會滲入任何後續代碼。所以這是完全合法的,但它是正確的嗎?這就是你需要決定的。 – PaulMcKenzie

回答

1

非常粗俗地說,push_macro的意思是「存儲當前的宏定義」,pop_macro的意思是「恢復宏的保存的定義」。

這兩個命令在當前翻譯單元(即當前編譯的cpp文件和包括頭文件)的範圍內都有意義。

所以,如果你不打電話pop_macro,簡單的宏的定義將不會被恢復,這是完全允許的,並不意味着UB。

pop_macro你把在採樣結束「隨着pop_macro」實際上將沒有任何效果,因爲沒有代碼之後它會被編譯

請注意,我們所談論的東西在編譯時發生的事情,不在運行時