2008年10月14日 星期二

Visual C++避開max, min macro的問題

WinDef.h內有定義max, min等macro (當你#include windows.h, WinDef.h就會被引入了)

#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif

#ifndef min
#define min(a,b) (((a) < (b)) ? (a) : (b))
#endif


這會造成命名的衝突以及使用上的問題,例如我假設要使用stl的numeric_limits來取得double的最大值

#include
#include

using namespace std;

void main()
{
double maxValue = numeric_limits::max(); // 錯誤,因為max是一個macro,會先被preprocessor處理
cout << maxValue;
}


解決方法:
只要在#include WinDef.h之前,#define NOMINMAX或是在專案設定的Preprocessor裡輸入NOMINMAX就可以關閉max, min macro了



-----------------------------
有太多的C++書籍呼籲你不要再使用#define來定義function了,而是改用inline等方式

2 則留言:

fr3@K 提到...

另外一個方法:

using namespace std;

const string a("qwert");
const string b("abcde");

string c = (min)(a, b);
string d = (max)(a, b);

高橋旺 提到...

嗯.. 避開巨集的快速好用的方法.. :)
3QQQ

LinkWithin

Related Posts with Thumbnails