2009-09-08 57 views
17

我有問題,std :: numeric_limits :: min()與「windef.h」中定義的「min」宏衝突。有沒有什麼辦法可以解決這個衝突,而不需要定義「min」宏。 下面的鏈接提供了一些提示,但我無法設法使用括號和靜態成員函數。宏和成員函數衝突

What are some tricks I can use with macros?

預先感謝您。

+8

爲什麼括號裏的技巧不適合你?請記住圍繞整個表達式,如'(std :: numeric_limits :: min)()' – 2009-09-08 14:51:28

+0

這工作。謝謝。請將它作爲答案發送,我想接受它。 – msh 2009-09-09 05:41:02

+0

感謝一羣人,不敢相信我在#undef's多年前一直在嘲笑有人提起這件事...... – Roel 2009-12-28 17:07:49

回答

29

的解決方法是使用括號:int max = (numeric_limits<int>::max)();

它可以讓你有windef.h,並不要求你#undef max(這可能有不良的副作用),並且不需要#define NONIMAX。奇蹟般有效!

+0

你能解釋它爲什麼可行嗎? – Derek 2013-04-29 15:15:05

+1

根據我的理解,它首先處理括號中的值。該宏也接受兩個參數,但封閉了函數括號,它不會向宏顯示任何參數。 – Apeiron 2014-08-07 17:46:07

1

是的,我遇到了同樣的問題。我發現只有一種解決方案:

#ifdef min 
#undef min 
#endif //min 

把它放在包含完成之後。

+2

請注意'#ifdef'是不必要的。 '#undef'沒有被定義爲宏,所以'#undef min'是安全的,無論是否定義了min。 – 2011-02-16 05:22:04

23

唯一真正通用的解決方案是不包括在頭文件中的windows.h

這個頭文件是一個殺手鐗,它幾乎可以讓你的代碼崩潰。如果沒有啓用MSVC語言擴展,它將無法編譯,這是我見過的宏觀濫用的最糟糕的例子。

將它包含在一個.cpp文件中,然後在頭文件中展示包裝,其餘代碼可以使用它。如果windows.h不可見,它不會與你的名字衝突。

對於最小/最大情況,具體可以在包括windows.h之前使用#define NOMINMAX。它將不會定義這些特定的宏。

+1

投票結束,因爲我們在這裏得出了同樣的結論。除其他弊端之外,它還增加了大約19K *每個目標文件*。我們只用我們通常需要從windows.h中得到的一些東西創建自己的頭文件。 – 2009-09-08 14:07:38

+2

很好的答案。不知道那個'NOMINMAX'的詭計。 – 2009-09-08 14:50:12

+6

嗯,這是一個典型的微軟解決方案......「我們的宏造成了麻煩?那麼,我們只需添加一個宏來禁用它們!」 ;) – jalf 2009-09-08 15:08:48

1

除了jalf的回答之外,在包含windows.h之前,您也可以使用#define WINDOWS_LEAN_AND_MEAN。它會從Windows頭文件中刪除最小,最大和更多噪音。

+0

謝謝。但是在我的項目中,這讓人頭疼得多。 – msh 2009-09-09 05:45:29

1

Dewfy, 該解決方案的問題是如果你想使用宏後院。

我甚至試過定義NOMINMAX,但它沒有奏效。

我發現了從約翰內斯紹布的一個最好的解決辦法: (的std :: numeric_limits ::分)()

0
#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; 
}