#define NOMINMAX



  • Wo definiere ich denn dieses Makro?

    Definiere ich es in der stdafx.h vor #include <Windows.h> erhalte ich die Warnung:
    warning C4005: 'NOMINMAX': macro redefinition

    definiere ich es danach erhalte ich Fehlermeldungen bei irgendwelchen Methoden die in irgendeiner weise min oder max aufrufen.

    Hilfe. Ich verstehe das nicht.



  • Probiere es doch mal mit

    #undef min
    #undef max

    Und generell gilt für Posts hier im Forum: Wenn du Fehlermeldungen bekommst: kopieren und hier einfügen. Ansonsten können wir dir nur selten sinnvoll helfen.



  • @booster sagte in #define NOMINMAX:

    Wo definiere ich denn dieses Makro?

    Auf der Kommandozeile des Compilers: /DNOMINMAX



  • Das ist wohl etwas schräg.
    NOMINMAX wird n der Windows.h nur dann eingefügt, wenn auch RC_INVOKED gesetzt ist.

    Was ist denn das für ein Projekt?



  • @martin-richter sagte in #define NOMINMAX:

    NOMINMAX wird n der Windows.h nur dann eingefügt, wenn auch RC_INVOKED gesetzt ist.

    RC_INVOKED habe ich nicht gesetzt

    @martin-richter sagte in #define NOMINMAX:

    Was ist denn das für ein Projekt?

    Ich habe in meiner Solution 5 statische Libs eine dll und eine exe.
    die dll verwendet die statischen libs.

    Ich hatte das makro nicht in allen projekten meiner solution im stdafx.h gesetzt. Eigentlich nur dort wo es nötig war.
    Jetzt habe ich das Makro mal durchgängig gesetzt und die Warnung ist weg. Aber ob das nun die richtige Lösung weiß ich nicht.



  • @booster sagte in #define NOMINMAX:

    RC_INVOKED habe ich nicht gesetzt

    Hast du ein .rc File in deinem Projekt?
    Das wird nämlich normalerweise mit definiertem RC_INVOKED "übersetzt" - dazu ist RC_INVOKED nämlich da 😉



  • Wie hustbaer geschrieben hat. In einem C/C++ Projkekt für C/C++ Dateien hat der define RC_INVOKED nichts zu suchen.

    Dieser define wird benutzt um es dem RC-Compiler (der ziemlich dämlich ist) leichter zu machen, defines zu finden und nicht über Code zu stolpern, den er nicht versteht.



  • #ifndef NOMINMAX
    #define NOMINMAX
    #endif
    
    // evtl. auch von Interesse
    #ifndef WIN32_LEAN_AND_MEAN
    #define WIN32_LEAN_AND_MEAN
    #endif
    


  • @martin-richter sagte in #define NOMINMAX:

    Wie hustbaer geschrieben hat. In einem C/C++ Projkekt für C/C++ Dateien hat der define RC_INVOKED nichts zu suchen.

    Bin etwas verwirrt. Wo hat hustbear geschrieben dass RC_INVOKED nichts zu suchen hat?

    @hustbaer sagte in #define NOMINMAX:

    Hast du ein .rc File in deinem Projekt?

    In einem Projekt ja. In der DLL.

    Und das bedeutet jetzt?
    -> Wenn ich ein RC-File habe ich RC_INVOKED gesetzt
    -> Wenn RC_INVOKED gesetzt ist wird NOMINMAX in der Windows.h eingefügt
    -> Und das bedeutet nun was ??



  • RC_INVOKED hat als define in einer Header Datei nichts zu suchen. Auch nicht als define für den Compiler.

    Dieses muss man nicht setzen. Man kann es benutzen. Gesetzt wird es nur durch den Resourcen-Compiler.

    Ich weiß nicht was da so schwierig ist.



  • @martin-richter sagte in #define NOMINMAX:

    Ich weiß nicht was da so schwierig ist.

    Weiß ich auch nicht. Weiß nur nicht was ihr mir mit dem RC Invoked sagen wollt.
    Zum Glück hast du deinen Namen nicht zum Beruf gemacht. Sonst würden alle angeklagten Schuldig gesprochen werden

    @martin-richter sagte in #define NOMINMAX:

    RC_INVOKED hat als define in einer Header Datei nichts zu suchen. Auch nicht als define für den Compiler.
    Dieses muss man nicht setzen. Man kann es benutzen. Gesetzt wird es nur durch den Resourcen-Compiler.

    Ich habe kein RC_INVOKED gesetzt!



  • mimimimimi



  • @martin-richter sagte in #define NOMINMAX:

    Das ist wohl etwas schräg.
    NOMINMAX wird in der Windows.h nur dann eingefügt, wenn auch RC_INVOKED gesetzt ist.

    Was ist denn das für ein Projekt?

    Dann kläre wo der define herkommt.
    Lass Dir eine Preprozessor Ausgabe machen...



  • Was gibts denn da zu klären? Ich kann direkt auf die Fehlermeldung clicken und werde zur Zeile gebracht, wo das schon definiert ist. Bei MinGW GCC 8.2.0 wäre das in os_defines.h

    // Don't let win32api windef.h define min and max as macros
    // if included after c++config.h.
    #undef NOMINMAX
    #define NOMINMAX 1
    

    Sollte kein großes Suchspiel sein. Und diese Warnung verhindert man ganz einfach, siehe mein erster Beitrag. Oder wie in diesem Codeschnipsel. Kommt immer drauf an wie man das Verhalten genau haben möchte.


Log in to reply