2008-08-18 53 views

回答

17

檢查你的代碼,包括WINDOWS.H頭文件,要麼你的代碼或其他第三方頭有自己分鐘()/MAX()定義。如果是,則與NOMINMAX的這樣一個定義,預先考慮您的WINDOWS.H包括:

#define NOMINMAX 
#include <windows.h> 
1

啊...範圍吧,夥計:std::min()std::max()

+5

您仍然需要#define NOMINMAX或預處理器仍然會擴展min&max。 – Ferruccio 2008-09-11 01:49:36

0

我有多年沒有使用過它,但是從內存提升也可能指定最小和最大,可能嗎?

2

另一種可能性來自副作用。大多數最小/最大宏將多次包含這些參數,可能無法達到您的預期。錯誤和警告也可能產生。

 
max(a,i++) expands as ((a) > (i++) ? (a) : (i++))

afterwards i is either plus 1 or plus 2

擴展中的()將避免使用公式調用它時出現的問題。嘗試擴大最大值(A,B + C)

0

老實說,當涉及到最低/最高,我覺得最好還是定義自己的:

#define min(a,b) ((a) < (b) ? (a) : (b)) 
#define max(a,b) ((a) >= (b) ? (a) : (b)) 
+4

坦率地說,這是在尋求麻煩。在C++中,使用'使用std :: swap`並編寫自己的交換時,你可以做得比默認更好。在C語言中,寫下`#define min(a,b)((a)<(b)?(a):(b))`並確認你不會用任何副作用調用它,因爲你會有多重評價。 – 2009-11-24 22:28:35

2

由於Windows此定義爲函數式宏,以下解決方法可供選擇:

int i = std::min<int>(3,5); 

這工作,因爲宏觀min()時,它的後面<只有當min後跟(擴大,而不是。