2009-12-15 4 views
55

Diese Zeile korrekt in einem kleinen Testprogramm funktioniert, aber im Programm, für das ich es will, erhalte ich folgende Compiler Beschwerden:Warnung C4003 und Fehler C2589 und C2059 auf: x = std :: numeric_limits <int> :: max();

#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 die gleichen Ergebnisse mit bekommen:

#include <limits> 
using namespace std; 

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

Warum sieht Max als Makro max (a, b)? ?

+0

In meinem Fall, ohne die "-DNOMINMAX" bekam ich interne Compilerfehler. Es ist amüsant zu beobachten, wie Microsoft ständig gegen sich selbst kämpft. –

Antwort

74

Dies tritt häufig auf, wenn ein Windows-Header enthalten, die einen min oder max Makro definiert. Wenn Sie Windows-Header verwenden, geben Sie in Ihrem Code #define NOMINMAX ein, oder erstellen Sie mit dem entsprechenden Compiler-Switch (verwenden Sie also /DNOMINMAX für Visual Studio).

Beachten Sie, dass das Erstellen mit NOMINMAX die Verwendung des Makros in Ihrem gesamten Programm deaktiviert. Wenn Sie die Operationen min oder max verwenden müssen, verwenden Sie std::min() oder aus dem Header <algorithm>.

+0

Okay, ich muss nur fragen ... Kann ich beide in der gleichen Datei haben? x = std :: numerische_grenzen :: max(); // einige knifflige Präprozessor Befehle c = max (a, b); – Harvey

+0

@Harvey: Ich habe meine Antwort bearbeitet, um Ihre Verwendung von max() und macro max() in einer Datei zu behandeln. –

+0

Ich verwende min() und max() in anderen Dateien in diesem Projekt und mit vorkompilierten Headern, ist es für alle Dateien deaktiviert. #undef max funktioniert für meinen Fall und ist nur wirksam für den Rest der Datei, in der es ist. – Harvey

27

Eine andere Header-Datei verschmutzt den globalen Namensraum mit einem Max-Makro. Sie können das Problem beheben, indem undefining das Makro:

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

Behebe es nicht so, du kannst verhindern, dass es mit 'NOMINMAX' definiert wird. – GManNickG

61

Eine andere Lösung wäre, Funktionsname mit Klammern wie folgt zu umhüllen: (std::numeric_limits<int>::max)(). Gleiches gilt für std::max.

Nicht sicher, es ist eine gute Lösung für diese ... NOMINMAX ist besser IMO, aber das könnte in einigen Fällen eine Option sein.

+1

So wie ich die Verwendung der globalen Min/Max-Makros hasse, ist es manchmal schwierig, sie komplett aus einem Projekt zu entfernen. Habe das nie als Lösung gedacht, also +1. – icabod

+6

Leider sind Min- und Max-Makros im Windows-Plattform-SDK (z. B. in GDI + GdiplusTypes.h) weit verbreitet. Also antwortest du besser, dann definierst NOMINMAX. +1! – 23W

+0

Wie hilft die Verpackung hier? wirklich verwirrt, kannst du bitte etwas erklären? – sami1592

3
#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 
+0

@MattMcNabb Ich habe es geändert – dmjalund

0

Seine Definition in für mich in Visual Studio 2013 (für eine besseren Abstand formatiert ...) ist wie folgt:

static _Ty (max)() _THROW0() 
{ // return maximum value 
    return (FLT_MAX); 
} 

So bin ich FLT_MAX nur verwenden. :) Dies mag keine universelle Lösung sein, aber es funktioniert gut in meinem Fall, also dachte ich, ich würde teilen.

+1

Seien Sie vorsichtig, Sie (müssen) müssen ## Include 'für den Zugriff auf' FLT_MAX' –

Verwandte Themen