std::numeric_limits<double>::max() und max



  • 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 NOMINMAX
    

    Nun 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 max
    

    geschrieben 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


Anmelden zum Antworten