62 Stimmen

Warnung C4003 und Fehler C2589 und C2059 bei: x = std::numeric_limits<int>::max();

Diese Zeile funktioniert in einem kleinen Testprogramm korrekt, aber in dem Programm, für das ich sie benötige, erhalte ich die folgenden Compiler-Beschwerden:

#include <limits>

x = std::numeric_limits<int>::max();

c:\...\x.cpp(192) : warning C4003: not enough actual parameters for macro 'max'
c:\...\x.cpp(192) : error C2589: '(' : illegal token on right side of '::'
c:\...\x.cpp(192) : error C2059: syntax error : '::'

Ich erhalte die gleichen Ergebnisse mit:

#include <limits>
using namespace std;

x = numeric_limits<int>::max();

Warum wird max als das Makro max(a,b); gesehen?

80voto

Steve Guidi Punkte 19012

Dies tritt üblicherweise auf, wenn eine Windows-Kopfzeile eingefügt wird, die eine min o max Makro. Wenn Sie Windows-Kopfzeilen verwenden, setzen Sie #define NOMINMAX in Ihren Code einbauen oder mit dem entsprechenden Compilerschalter (d.h. mit /DNOMINMAX für Visual Studio).

Beachten Sie, dass das Bauen mit NOMINMAX deaktiviert die Verwendung des Makros in Ihrem gesamten Programm. Wenn Sie das Makro min o max Operationen, verwenden std::min() o std::max() von der <algorithm> Kopfzeile.

71voto

denis-bu Punkte 3386

Eine andere Lösung wäre, den Funktionsnamen wie folgt in Klammern zu setzen: (std::numeric_limits<int>::max)() . Das Gleiche gilt für std::max .

Ich bin nicht sicher, ob das eine gute Lösung ist... NOMINMAX ist besser IMO, aber dies könnte eine Option in einigen Fällen sein.

27voto

R Samuel Klatchko Punkte 72641

Eine andere Header-Datei verschmutzt den globalen Namensraum mit einem max-Makro. Sie können dies beheben, indem Sie das Makro undefinieren:

#undef max
x = std::numeric_limits<int>::max();

4voto

dmjalund Punkte 275
#ifdef max
#pragma push_macro("max")
#undef max
#define _restore_max_
#endif

#include <limits>

//... your stuff that uses limits

#ifdef _restore_max_
#pragma pop_macro("max")
#undef _restore_max_
#endif

2voto

(std::numeric_limits::max)()

Ein Kinderspiel.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X