2014-04-11 23 views
2

在研究windows解決方案min/max宏問題時,我找到了一個我很喜歡的答案,但我不明白它爲什麼起作用。 C++規範中有哪些內容說明宏替代不是在parens中發生的?如果是這樣的話?這只是其他方面的副作用,還是設計用於這種方式的語言?如果我使用額外的括號的max宏不會導致出現問題:爲什麼包頭阻止宏觀替代?

(std::numeric_limits<int>::max)() 

我在一家大型MFC項目上工作,並且有使用這些宏一些窗口庫,所以我寧願不使用#undef技巧。

我的其他問題是這樣的。 .cpp文件中的#undef max僅影響在其中使用的文件,還是會爲其他編譯單元取消定義max

+2

'#undef X'只刪除了'X'的定義,直到當前文件編譯結束(或直到'X'再次被定義爲#)。 – mah

+1

在包含Windows.h以禁用這些宏之前,您可以嘗試'#define NOMINMAX'。不要擔心會干擾MFC預期可用的任何內容。 –

+0

NOMINMAX將不起作用。還有其他庫和頭文件需要min和max。就我而言,這是一個現有的項目,所以我不想讓項目的其他部分使用的東西沒有定義。 – shawn1874

回答

8

函數式的宏只在後面的東西是左括號時擴展。當用圓括號包圍名稱時,名稱後的下一個事項是右括號,因此不會發生擴展。

從C++ 11§16.3 [cpp.replace]/10:

的函數宏名稱,後跟一個作爲下一個預處理標記的每個後續的實例介紹的序列預處理由替換列表中去網絡nition(宏調用)替換令牌。

要回答另一個問題,預處理正常編譯和鏈接之前發生,在實現文件中,這樣做的#undef只會影響該文件。在標題中,它會影響包含該標題的每個文件。

相關問題