我有問題,std :: numeric_limits :: min()與「windef.h」中定義的「min」宏衝突。有沒有什麼辦法可以解決這個衝突,而不需要定義「min」宏。 下面的鏈接提供了一些提示,但我無法設法使用括號和靜態成員函數。宏和成員函數衝突
What are some tricks I can use with macros?
預先感謝您。
我有問題,std :: numeric_limits :: min()與「windef.h」中定義的「min」宏衝突。有沒有什麼辦法可以解決這個衝突,而不需要定義「min」宏。 下面的鏈接提供了一些提示,但我無法設法使用括號和靜態成員函數。宏和成員函數衝突
What are some tricks I can use with macros?
預先感謝您。
是的,我遇到了同樣的問題。我發現只有一種解決方案:
#ifdef min
#undef min
#endif //min
把它放在包含完成之後。
請注意'#ifdef'是不必要的。 '#undef'沒有被定義爲宏,所以'#undef min'是安全的,無論是否定義了min。 – 2011-02-16 05:22:04
唯一真正通用的解決方案是不包括在頭文件中的windows.h。
這個頭文件是一個殺手鐗,它幾乎可以讓你的代碼崩潰。如果沒有啓用MSVC語言擴展,它將無法編譯,這是我見過的宏觀濫用的最糟糕的例子。
將它包含在一個.cpp文件中,然後在頭文件中展示包裝,其餘代碼可以使用它。如果windows.h不可見,它不會與你的名字衝突。
對於最小/最大情況,具體可以在包括windows.h之前使用#define NOMINMAX
。它將不會定義這些特定的宏。
投票結束,因爲我們在這裏得出了同樣的結論。除其他弊端之外,它還增加了大約19K *每個目標文件*。我們只用我們通常需要從windows.h中得到的一些東西創建自己的頭文件。 – 2009-09-08 14:07:38
很好的答案。不知道那個'NOMINMAX'的詭計。 – 2009-09-08 14:50:12
嗯,這是一個典型的微軟解決方案......「我們的宏造成了麻煩?那麼,我們只需添加一個宏來禁用它們!」 ;) – jalf 2009-09-08 15:08:48
除了jalf的回答之外,在包含windows.h之前,您也可以使用#define WINDOWS_LEAN_AND_MEAN
。它會從Windows頭文件中刪除最小,最大和更多噪音。
謝謝。但是在我的項目中,這讓人頭疼得多。 – msh 2009-09-09 05:45:29
Dewfy, 該解決方案的問題是如果你想使用宏後院。
我甚至試過定義NOMINMAX,但它沒有奏效。
我發現了從約翰內斯紹布的一個最好的解決辦法: (的std :: numeric_limits ::分)()
#define NOTHING
int main()
{
int m = -1;
m = max(0, 1); // expands max macro
m = max NOTHING (0, 1); // error 'max': identifier not found
// functions-like macros are defined as an
// identifier immediately followed by a left
// parenthesis - N3690/16.3/10
m = std::max NOTHING (2, 3); // NOTHING stops the macro
// expansion (max is not followed by left
// parenthesis): std::max is called
m = (std::max)(4, 5); // the enclosing parenthesis stops the macro
// expansion (max is not followed by left
// parenthesis): std::max is called
return 0;
}
爲什麼括號裏的技巧不適合你?請記住圍繞整個表達式,如'(std :: numeric_limits :: min)()' –
2009-09-08 14:51:28
這工作。謝謝。請將它作爲答案發送,我想接受它。 – msh 2009-09-09 05:41:02
感謝一羣人,不敢相信我在#undef's多年前一直在嘲笑有人提起這件事...... – Roel 2009-12-28 17:07:49