Frage Std :: Min gibt Fehler


#include <algorithm>
#include <Windows.h>

int main()
{
    int k = std::min(3, 4);
    return 0;
}

Was macht Windows, wenn ich Windows.h habe. Ich kann std :: min in Visual Studio 2005 nicht verwenden. Die Fehlermeldung lautet:

error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'

75
2018-02-15 14:26


Ursprung


Antworten:


Das windows.h Header-Datei (oder richtiger, windef.h dass es wiederum enthält) hat Makros für min und max welche stören.

Du solltest #define NOMINMAX bevor Sie es einschließen.


115
2018-02-15 14:28



Keine Notwendigkeit, etwas zu definieren, umgehen Sie einfach das Makro mit dieser Syntax:

(std::min)(a, b); // added parentheses around function name
(std::max)(a, b);

66
2018-02-25 18:34



Wie bereits erwähnt, sind die Fehler auf Min / Max-Makros zurückzuführen, die in Windows-Kopfzeilen definiert sind. Es gibt drei Möglichkeiten, sie zu deaktivieren.

1) #define NOMINMAX vor dem Einfügen von Header ist dies im Allgemeinen eine schlechte Technik zum Definieren von Makros, um die folgenden Header zu beeinflussen;

2) definieren NOMINMAX in Compiler-Befehlszeile / IDE. Das Schlimme an dieser Entscheidung ist, dass Sie, wenn Sie Ihre Quellen versenden möchten, die Benutzer warnen müssen, dasselbe zu tun;

3) einfach die Makros in Ihrem Code aufheben, bevor sie verwendet werden

#undef min
#undef max

Dies ist wahrscheinlich die mobilste und flexibelste Lösung.


22
2018-02-15 14:56



Versuchen Sie etwas wie folgt:

#define NOMINMAX
#include <windows.h>

Standardmäßig definiert windows.h min und max als Makros. Wenn diese erweitert werden, Code, der versucht zu verwenden std::min (Zum Beispiel) wird am Ende etwa so aussehen:

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

Die Fehlermeldung sagt dir das std::(x) ist nicht erlaubt.


11
2018-02-15 14:29



Ich habe immer noch Probleme mit den Windows Headern und die projektweite Definition von NOMINMAX scheint nicht immer zu funktionieren. Als Alternative zur Verwendung von Klammern mache ich den Typ manchmal wie folgt explizit:

int k = std::min<int>(3, 4);

Dies verhindert auch, dass der Präprozessor mit übereinstimmt min und ist besser lesbar als die Umgehung der Klammern.


10
2018-06-18 20:06



In meinem Fall hat Projekt nicht eingeschlossen windows.h oder windef.h ausdrücklich. Es war Boost. Also habe ich das Problem gelöst, indem ich zum Projekt gegangen bin Properties -> C/C++ -> Preprocessorund anhängen NOMINMAX in dem Preprocessor Definitions (VS 2013, VS 2015).


3
2017-11-22 19:00



#define NOMINMAX

ist der Trick, um die Makrodefinitionen von max und min zu unterdrücken

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


2
2018-02-15 14:30



Für Leute einschließlich windows.h, fügen Sie die folgenden in betroffenen Überschriften ein:

#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")

In Quelldateien nur #undef min und max.

#include windows headers ...

#undef min
#undef max

#include headers expecting std::min/std::max ...

2
2017-10-02 19:18



Ich würde annehmen, dass windows.h min als Makro definiert, z. mögen

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

Das würde die Fehlermeldung erklären.


1
2018-02-15 14:29



Um dieses Problem zu lösen, erstelle ich nur die Header-Datei namens fix_minmax.h  ohne schließen Wachen ein

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

Grundlegende Verwendung ist wie folgt.

// Annoying third party header with min/max macros
#include "microsoft-mega-api.h"
#include "fix_minmax.h"

Vorteile dieses Ansatzes ist, dass es mit jeder Art von Include-Datei oder Code-Teil funktioniert. Dies spart Ihnen auch Zeit beim Umgang mit Code oder Bibliotheken, die davon abhängen min/max Makros


-1
2018-06-13 20:28