#define in Klasse C, #ifdef in Klasse B und A ?



  • Hallo,
    für eine Programmieraufgabe muss ich folgendes realisieren:

    Ich habe 2 Header-Files bekommen die ich in 2 Klassen implementieren muss.

    In einer der zwei Klassen muss ich eine Präprozessor-Direktive abfragen (#ifdef / #else / #endif).

    Die Direktive (#define) wird jedoch in einer Testklasse auf die ich keinen Einfluss habe gesetzt.

    In meiner Klasse habe ich die Direktive am oberen Ende der Klasse wie folgt abgefragt:

    #ifdef NULL_SPIEL
    #define TEN_VALUE 0.5
    #else
    #define TEN_VALUE 0.8
    #endif
    .
    .
    .
    

    Mein Problem liegt jetzt darin dass, egal wie ich meine Version der Testklasse zusammenbastle, in keinem Fall "NULL_SPIEL" erkannt wird.

    Muss dazu sagen dass ich C++-Anfänger bin. Gibts da irgendwelche Sichtbarkeitsregeln für Präprozessordirektiven? Hab bereits im Netz gesucht, bin aber immer nur auf Beispiele gestoßen in denen in ein und derselben Klasse die Direktive gesetzt und gleich wieder abgefragt wird.

    Wie kann ich dir Direktive in einer Klasse "C" setzen, wobei Klasse "C" meine beiden Klassen benutzt?

    Gruß
    Alex



  • eben fällt mir ein dass ich ja den Compiler auf die Direktive einstellen kann. Damit hat's jetzt geklappt.

    Aber generell:

    Kann ich die direktive nicht auch in einer anderen Klasse setzen die dann die Klassen die #ifdef - Abfragen enthalten "benutzen" ?
    Oder geht sowas wirklich NUR über die Compiler-Einstellung ?

    - Alex



  • alex0801 schrieb:

    Mein Problem liegt jetzt darin dass, egal wie ich meine Version der Testklasse zusammenbastle, in keinem Fall "NULL_SPIEL" erkannt wird.

    Der Präprozessor kümmert sich überhaupt nicht um Klassen und ähnliches, sondern arbeitet mit Dateien, ohne sich groß um ihre innere Struktur zu kümmern.

    Und zur Sichtbarkeit/Gültigkeit von Makros: Ein #define gilt von dem Punkt an, wo es definiert ist, bis zum Ende der aktuellen Übersetzungseinheit (das bedeutet: dein CPP-File, nachdem alle #include's durch den Inhalt des angegebenen Headers ersetzt und alle #if/#ifdef/... aufgelöst worden sind).*
    Das heißt, um den Wert NULL_SPIEL nutzen zu können, mußt du ihn entweder selber definieren (über die Compiler-Optionen oder ein eigenes #define vor der Nutzung), oder du bindest mit #include die Datei ein, in der es definiert wird/werden sollte.

    Edit: * oder bis es per #undef wieder gelöscht wird



  • Hallo,
    danke für die schnelle und ausführliche Antwort. Denke jetzt bin ich im Bilde ...

    In meinem Fall geht es dann nur über die Compiler-Einstellung 🙂

    Gruß
    Alex


Anmelden zum Antworten