簡體   English   中英

為什么包含 windows.h 時 std::min 失敗?

[英]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 )具有用於干擾的minmax宏。

在包含它之前,您應該#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 將minmax定義為宏。 當這些被展開時,嘗試使用std::min代碼(例如)最終看起來像這樣:

int k = std::(x) < (y) ? (x) : (y);

錯誤消息告訴您std::(x)是不允許的。

就我而言,項目沒有明確包含windows.hwindef.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 ...
#define NOMINMAX

是抑制 max 和 min 的宏定義的技巧

http://support.microsoft.com/kb/143208

為了解決這個問題,我只創建了一個名為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM