#define-Salat



  • Hallo,

    habe da mal eine Frage zum Umgang mit defines bzw. Alternativen dazu.

    Ich habe ein ziemlich umfangreiches C++-Projekt mit vielen Konfigurationen, in denen per define (#ifdef XYZ) bestimmte Codeteile ein- bzw. auskommentiert werden.
    Durch den großen Umfang ist die Gefahr inzwischen groß, dass ein define falsch oder nicht gesetzt wurde und der Code entsprechend die falschen Funktionen abarbeitet. Das muss erstmal gar nicht auffallen sondern erst später, wenn das daraus erstellte tool angewendet wird.

    Eine Idee zur Abhilfe war, den defines Werte zuzuweisen, also je nach Konfiguration zu definieren XYZ=1 bzw. XYZ=2 u.s.w. Im Code wird dann abgefragt:

    #if XYZ=1
      //Code1
    #elif XYZ=2
      //Code2
    #else
      //Fehlermeldung
    #endif
    

    Leider funktioniert das so nicht, obwohl ein Bekannter angeblich so schonmal ein Problem gelöst hat.

    Ist hier vielleicht nur der Syntax falsch? Hab allerdings schon diverse Varianten ausprobiert.

    Oder gibts da vielleicht ein ganz anderes Konzept, um mit den vielen defines klarzukommen, oder die sogar durch was anderes zu ersetzen?

    Grüße
    snami

    ------------------------------------------

    WXP, VS 2005



  • Ja, die Syntax ist falsch - Vergleiche werden in C++ mit == durchgeführt (auch vom Präprozessor).



  • Mit == hab ich das ganze auch schon probiert. Funktioniert leider genauso nicht wie mit =.

    Ich habe auch mal die Werte 1 und 2 vertauscht:

    #if XYZ==2
      //Code1
    #elif XYZ==1
      //Code2
    #else
      //Fehlermeldung
    #endif
    

    Das Programm führt immer Code 1 aus, nimmt also immer die erste Verzweigung, egal ob hinter XYZ ==1 oder ==2 steht.
    Die Definition lautet hier übrigens "XYZ=1"



  • Snami schrieb:

    Die Definition lautet hier übrigens "XYZ=1"

    Wo steht denn diese Definition?



  • Wo steht denn diese Definition?

    Projekt -> Eigenschaften -> Präprozessor -> Präprozessordefinition

    Eben hat das ganz übrigens bei mir funktioniert, warum auch immer.
    Dann habe ich aber mal das ganze mit Strings versucht:

    Define: XYZ="DEF"

    #if XYZ=="ABC"
      //Code1
    #elif XYZ=="DEF"
      //Code2
    #else
      //Fehlermeldung
    #endif
    

    Hier wird wieder immer Code1 ausgeführt.



  • Also mit Strings/String-Literalen dürfte es nicht funktionieren - da beherrscht noch nichtmal C selber den Vergleich vernünftig (ein Grund, warum es strcmp() gibt).

    Aber es ist trotzdem seltsam, daß überhaupt eine der Bedingungen als erfüllt gilt - ich würde entweder erwarten, daß der Präprozessor den "richtigen" Block auswählt, oder daß er den #else Block nimmt.


Anmelden zum Antworten