![](/img/trans.png)
[英]Why am I getting the error “WM_MENUCOMMAND was not declared in this scope” when I included windows.h?
[英]Why is std::min failing when windows.h is included?
#include <algorithm>
#include <Windows.h>
int main()
{
int k = std::min(3, 4);
return 0;
}
如果我包含 Windows.h,Windows 會做什么? 我無法在 Visual Studio 2005 中使用std::min
。錯誤消息是:
error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'
windows.h
頭文件(或更windef.h
,它依次包含的windef.h
)具有用於干擾的min
和max
宏。
在包含它之前,您應該#define NOMINMAX
。
無需定義任何東西,只需使用以下語法繞過宏:
(std::min)(a, b); // added parentheses around function name
(std::max)(a, b);
我偶爾仍然遇到 Windows 標題的問題,並且 NOMINMAX 的項目范圍定義似乎並不總是有效。 作為使用括號的替代方法,我有時會像這樣使類型顯式:
auto k = std::min<int>(3, 4);
這也會阻止預處理器與min
匹配,並且可以說比括號解決方法更具可讀性。
正如其他人所提到的,這些錯誤是由於 Windows 標題中定義的最小/最大宏造成的。 有三種方法可以禁用它們。
1) #define NOMINMAX
在包含頭文件之前,這通常是定義宏以影響以下頭文件的糟糕技術;
2) 在編譯器命令行/IDE 中定義NOMINMAX
。 這個決定的壞處是,如果你想發布你的源代碼,你需要警告用戶也這樣做;
3)在使用之前簡單地取消定義代碼中的宏
#undef min
#undef max
這可能是最便攜和最靈活的解決方案。
嘗試這樣的事情:
#define NOMINMAX
#include <windows.h>
默認情況下,windows.h 將min
和max
定義為宏。 當這些被展開時,嘗試使用std::min
代碼(例如)最終看起來像這樣:
int k = std::(x) < (y) ? (x) : (y);
錯誤消息告訴您std::(x)
是不允許的。
就我而言,項目沒有明確包含windows.h
或windef.h
。 它正在使用Boost。 因此,我通過轉到項目Properties -> C/C++ -> Preprocessor
並在Preprocessor Definitions
(VS 2013, VS 2015) 中附加NOMINMAX
解決了這個問題。
對於包括 windows.h 在內的人,請將以下內容放入受影響的標題中:
#include windows headers ...
pragma push_macro("min")
pragma push_macro("max")
#undef min
#undef max
#include headers expecting std::min/std::max ...
...
pragma pop_macro("min")
pragma pop_macro("max")
在源文件中只有 #undef min 和 max。
#include windows headers ...
#undef min
#undef max
#include headers expecting std::min/std::max ...
為了解決這個問題,我只創建了一個名為fix_minmax.h
頭文件,沒有包含保護
#ifdef max
#undef max
#endif
#ifdef min
#undef min
#endif
#ifdef MAX
#undef MAX
#endif
#define MAX max
#ifdef MIN
#undef MIN
#endif
#define MIN min
#include <algorithm>
using std::max;
using std::min;
基本用法是這樣的。
// Annoying third party header with min/max macros
#include "microsoft-mega-api.h"
#include "fix_minmax.h"
這種方法的優點是它適用於各種包含的文件或部分代碼。 在處理依賴於min
/ max
宏的代碼或庫時,這也可以節省您的時間
我假設 windows.h 確實將 min 定義為宏,例如
#define min(a,b) ((a < b) ? a : b)
這將解釋錯誤消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.