Seltsame C++-Fehler mit Code, der min()/max()-Aufrufe enthält
Frage
Ich sehe seltsame Fehler, wenn mein C++-Code min()- oder max()-Aufrufe enthält.Ich verwende Visual C++-Compiler.
Lösung
Überprüfen Sie, ob Ihr Code das enthält Windows.h Header-Datei und entweder Ihr Code oder andere Header von Drittanbietern haben ihre eigenen Mindest()/max() Definitionen.Wenn ja, dann stellen Sie Ihre voran Windows.h Inklusion mit einer Definition von NOMINMAX so was:
#define NOMINMAX
#include <windows.h>
Andere Tipps
Eine andere Möglichkeit könnten Nebenwirkungen sein.Die meisten Min/Max-Makros enthalten die Parameter mehrfach und erfüllen möglicherweise nicht das, was Sie erwarten.Es könnten auch Fehler und Warnungen generiert werden.
max(a,i++) expands as ((a) > (i++) ? (a) : (i++))Die () in der Erweiterung sollen Probleme vermeiden, wenn Sie sie mit Formeln aufrufen.Versuchen Sie, max(a,b+c) zu erweitern.danach ist i entweder plus 1 oder plus 2
Da Windows dies als Makro im Funktionsstil definiert, ist die folgende Problemumgehung verfügbar:
int i = std::min<int>(3,5);
Das funktioniert, weil das Makro min()
wird nur erweitert, wenn min
wird gefolgt von (
, und nicht, wenn darauf gefolgt wird <
.
Pfui...Schau es dir an, Alter: std::min()
, std::max()
.
Ich habe es seit Jahren nicht mehr verwendet, aber aus dem Gedächtnis heraus weist Boost möglicherweise auch Min- und Max-Werte zu?
Ehrlich gesagt finde ich es am besten, wenn es um Min/Max geht, einfach mein eigenes zu definieren:
#define min(a,b) ((a) < (b) ? (a) : (b))
#define max(a,b) ((a) >= (b) ? (a) : (b))