#include <algorithm>
#include <Windows.h>
int main()
{
int k = std::min(3, 4);
return 0;
}
Was macht Windows, wenn ich Windows.h einbinde? Ich kann nicht std::min
in Visual Studio 2005 verwenden. Die Fehlermeldung lautet:
error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'
c++
visual-studio-2005
hidayat
quelle
quelle
Antworten:
Die
windows.h
Header-Datei (oder genauer gesagt,windef.h
die sie wiederum enthält) enthält Makros fürmin
undmax
die stören.Sie sollten es
#define NOMINMAX
vor dem Einfügen.quelle
Sie müssen nichts definieren, umgehen Sie einfach das Makro mit dieser Syntax:
quelle
min
oder zu habenmax
(Anwendungsbeispiel: Implementierung einer Klasse, die in das UniformRandomNumberGenerator- Konzept passt ).Wie bereits erwähnt, sind die Fehler auf Min / Max-Makros zurückzuführen, die in Windows-Headern definiert sind. Es gibt drei Möglichkeiten, sie zu deaktivieren.
1)
#define NOMINMAX
Vor dem Einfügen von Headern ist dies im Allgemeinen eine schlechte Technik zum Definieren von Makros, um die folgenden Header zu beeinflussen.2) Definieren Sie
NOMINMAX
in der Compiler-Befehlszeile / IDE. Das Schlechte an dieser Entscheidung ist, dass Sie die Benutzer warnen müssen, wenn Sie Ihre Quellen versenden möchten.3) Undefinieren Sie einfach die Makros in Ihrem Code, bevor Sie sie verwenden
Dies ist wahrscheinlich die tragbarste und flexibelste Lösung.
quelle
Ich habe immer noch gelegentlich 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 so explizit:
Dies verhindert auch, dass der Präprozessor mit dem Präprozessor übereinstimmt,
min
und ist wahrscheinlich besser lesbar als die Problemumgehung in Klammern.quelle
Versuchen Sie so etwas:
Standardmäßig definiert windows.h
min
undmax
als Makros. Wenn diese erweitert werden,std::min
sieht Code, der (zum Beispiel) zu verwenden versucht, ungefähr so aus:Die Fehlermeldung sagt Ihnen, dass dies
std::(x)
nicht erlaubt ist.quelle
In meinem Fall enthielt das Projekt nicht
windows.h
oder nichtwindef.h
explizit. Es wurde Boost verwendet. Also beschloss ich das Problem , indem auf das Projekt gehenProperties -> C/C++ -> Preprocessor
, und AnhängeNOMINMAX
in demPreprocessor Definitions
(VS 2013 VS 2015).quelle
Fügen Sie für Personen, einschließlich windows.h, Folgendes in die betroffenen Überschriften ein:
In Quelldateien nur #undef min und max.
quelle
ist der Trick, um die Makrodefinitionen von max und min zu unterdrücken
http://support.microsoft.com/kb/143208
quelle
Ich würde annehmen, dass windows.h min als Makro definiert, z. B. like
Das würde die Fehlermeldung erklären.
quelle
Um dieses Problem zu lösen , schaffe ich nur Header - Datei namens
fix_minmax.h
ohne Wachen schließenDie grundlegende Verwendung ist wie folgt.
Vorteile dieses Ansatzes sind, dass er mit jeder Art von eingeschlossener Datei oder Teil des Codes funktioniert. Dies spart auch Zeit beim Umgang mit Code oder Bibliotheken, die von
min
/max
macros abhängenquelle