Makro "abstellen"



  • Hoi,

    eine kurze Makro Frage: Ich will, dass ein Makro nur im Debug Modus was macht und im Releas Modus quasi garnichts.

    Ist das der richtige Weg:?

    #if defined _DEBUG
    #define FOO(X) ((X)*(X))
    #elif defined NDEBUG
    #define FOO(X)
    #endif
    

    Oder kann das zu Problemen führen?



  • miri schrieb:

    Hoi,

    eine kurze Makro Frage: Ich will, dass ein Makro nur im Debug Modus was macht und im Releas Modus quasi garnichts.

    Ist das der richtige Weg:?

    #if defined _DEBUG
    #define FOO(X) ((X)*(X))
    #elif defined NDEBUG
    #define FOO(X)
    #endif
    

    Oder kann das zu Problemen führen?

    Sowas wird oft gemacht. Allerdings ist mir die von dir benutzte Syntax unbekannt.

    ich kenne nur "#ifdef" und nicht "#if defined"...



  • Es geht beides. Ist Geschmacksache, was man da nimmt.

    Gruß Kimmi



  • Also brauch ich nicht sowas freakiges wie #define FOO(X) (void*)0
    ?
    Ich frag nur, weil ich das schon paar mal gesehen hab.



  • miri schrieb:

    Also brauch ich nicht sowas freakiges wie #define FOO(X) (void*)0
    ?
    Ich frag nur, weil ich das schon paar mal gesehen hab.

    Das hat anderen Zweck.

    willst Du im Code stehen haben

    if(a==5)
       LOG("a=",a);
    

    dann muß im releasemode auch ein

    #define LOG(x,y) {}
    

    da sein.
    (void*)0 ist wohl seltsam. vielleicht ist ((void)0) gemeint. aber auch das ist eigentlich eine schreibweise aus dem land von C.



  • Was man da "braucht" hängt davon ab, was das Makro darstellen soll. In deinem Beispiel könnte ich mir vorstellen, dass ich a = FOO(b); schreiben wollte, das ginge mit der "Release"-Variante ja nicht.



  • miri schrieb:

    Also brauch ich nicht sowas freakiges wie #define FOO(X) (void*)0
    ?
    Ich frag nur, weil ich das schon paar mal gesehen hab.

    Nein. Wenn du wirklich nur möchtest, dass FOO im Release-Modus nichts macht, genügt deine Definition.

    In anderer Hinsicht hat sie aber einen Fehler: Falls _DEBUG nicht definiert ist und NDEBUG auch nicht, bleibt FOO undefiniert. Besser so schreiben:

    #ifndef NDEBUG
       // Debug-Version
       #define FOO(X) ((X)*(X))
    #else
       // Release-Version
       #define FOO(X)
    #endif
    

    NDEBUG ist das korrekte Makro, um festzustellen, ob dein Code im Debug- oder Release-Modus übersetzt wird.

    Stefan.



  • Ich würde ((void)0) nehmen. Ist "tried and true".


Anmelden zum Antworten