std::numeric_limits<double>::max() und max
-
Hallo
Ich habe mir einen kleine Header mit verschiedenen inline Funktionen geschrieben und dabei verwende ich auch folgende Konstante:
std::numeric_limits<double>::max()Wenn ich mein Projekt nun kompiliere, bekomme ich immer Fehlermeldungen, also habe ich in die Headerdatei
undef maxgeschrieben. Funktioniert auch, aber da ich für mein Projekt GDI+ benutze, kriege ich jetzt folgende Fehlermeldung (vor Einbindung dieser Dateien ging alles gut):
error C3861: 'max': identifier not found
Das ganze natürlich in einer zu GDI+ gehörenden Datei.
Was kann ich da machen?
chrische
-
du musst schauen, was sich hinter dem dem makro verbirgt, und das dann, sofern möglich als funktion umdefinieren.
gdi max ist wahrscheinlich nichts anderes als std::max, oder?
-
Hallo
Genau. Die benutzen halt das normale Makro. Gibt es denn keine Möglichkeit, außer das als eigene Funktion zu bauen? Wenn es nur diese Möglichkeit gibt, muss ich das dann in den Header mit den selbstgeschriebenen Funktionen packen?
chrische
-
#define NOMINMAX #include <windows.h>
-
Hallo
Ich arbeite mit einer MFC SDI-Anwendung und weiß daher nicht, wo ich NOMINMAX definieren soll. Ich habe es im selber geschrieben Header und in der GDI+ Datei probiert, aber es hat beides nicht geklappt.
chrische
-
Einfach vor der Windows.h oder am besten gaaaanz am Anfang in deiner StdAfx.h
Das ist übrigens der code den man damit rausnimmt:
Ein typisches Beispiel für HOWnotTo use Makros#ifndef NOMINMAX #ifndef max #define max(a,b) (((a) > (b)) ? (a) : (b)) #endif #ifndef min #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif #endif /* NOMINMAX */
-
ohne templates war es früher viel schlimmer

-
Makros are evil!

-
Artchi schrieb:
Makros are evil!

assert("Macros are evil!"); // PENG!
-
Hallo
War kurz weg. Entweder stelle ich mich zu blöd an, oder ich habe mein Problem nicht genau beschrieben. Ich habe nun auf Rat in stdafx.h folgendes geschrieben:
#define NOMINMAXNun bekomme ich hunderte Fehler alle a la:
error C3861: 'max': identifier not found
Alle aus den GDI+ Dateien. Das erscheint mir auch logisch, weil diese ja eben auf das Makro zugreifen, welches ich abgeschaltet habe. Das selbe hatte ich ja, als ich einfach
#undef maxgeschrieben habe. Gibt es denn auch die Möglichkeit am Ende der Headerdatei das Makro wieder zu aktivieren? Warum beißt sich eigentlich:
std::numeric_limits<double>::max()mit dem Makro max?
chrische
-
schreib doch max als funktion kurz selber damit es für gdi+ wieder zur verfügung steht
-
Der Präprozessor ersetzt nunmal ohne Gnade alles was ihm in den Weg kommt. Er kennt max? Und ein max taucht in einem Text (Header oder CPP) auf? Wird ersetzt!
Versuch doch einfach mal std::numeric_limits<double>::max() zu kapseln (in einer Cpp) und hol es über eine andere Funktion.
// my_max.hpp // in diesem Header natürlich KEINE gdiplus inkludieren! extern double get_maXimum(); // my_max.cpp // in dieser cpp natürlich KEINE gdiplus inkludieren! double get_maXimum() { return std::numeric_limits<double>::max(); }Hoffentlich unterscheidet der Präprozessor ein kleines von einem großen X. Sonst wird auch das nichts bringen.

-
chrische5 schrieb:
error C3861: 'max': identifier not found
Alle aus den GDI+ Dateien. Das erscheint mir auch logisch, weil diese ja eben auf das Makro zugreifen, welches ich abgeschaltet habe.
Bringe doch einfach vor der Inclusion des Problemheaders das std::max Template in den globalen Namensraum per using std::max (natürlich nachdem algorithm includiert wurde). Dann verwenden die Makro-Benutzer stattdessen das max-Template. NOMINMAX muss natürlich auch definiert sein, damit es nicht wieder Konflikte gibt.
-
Hallo
Ich habe jetzt nach LordJaxom Tipp folgendes in stdafx.h geschrieben:
#include <algorithm>
using std::max;
using std::min;#define NOMINMAX
Und siehe da: es funktioniert.
chrische
-
Warum bedankst du dich dann nicht bei LordJaxom?
-
Artchi schrieb:
Der Präprozessor ersetzt nunmal ohne Gnade alles was ihm in den Weg kommt. Er kennt max? Und ein max taucht in einem Text (Header oder CPP) auf? Wird ersetzt!
Versuch doch einfach mal std::numeric_limits<double>::max() zu kapseln (in einer Cpp) und hol es über eine andere Funktion.
// my_max.hpp // in diesem Header natürlich KEINE gdiplus inkludieren! extern double get_maXimum(); // my_max.cpp // in dieser cpp natürlich KEINE gdiplus inkludieren! double get_maXimum() { return std::numeric_limits<double>::max(); }Hoffentlich unterscheidet der Präprozessor ein kleines von einem großen X. Sonst wird auch das nichts bringen.

ernst gemeint? so dumm ist der präprozesor auch nicht...
-
Eben. Erstens ersetzt der im preprocessing nur "freistehende" max, d.h. solche, die durch andere Tokens begrenzt sind. Und zweitens arbeitet der case sensitive.
-
Hallo
templäd schrieb:
Warum bedankst du dich dann nicht bei LordJaxom?
Das war natülich als Dank gedacht.
chrische