Frage Preprocessor-Konstanten



  • Wenn ich im Quelltext

    #if KONSTANTE
    

    habe. Reicht in VisualC das als KONSTANTE beim Compiler einzutragen. In CBuilder meckert er das er es nicht finden würde, erst wenn ich es als KONSTANTE=1 in Projektoptionen eintrage funktioniert es.

    Ist das ein "Fehler" und muss ich immer alle Konstanten so eintragen?



  • versuch mal

    #ifdef KONSTANTE
    


  • Guter Hinweis, jedoch stammt die Klasse nicht von mir. War auch nur eine allgemeine Frage ob ich eventuell etwas falsch mache oder das in CBuilder einfach so ist.



  • #if wirkt wie das normale if im Programmablauf, nur das es vom Präprozessor ausgewertet wird. Es wertet also den Ausdruck dahinter aus.
    #ifdef hingegen prüft ob das define überhaupt existiert. Dazu kann man auch noch

    #if defined(DEFINE)
    

    verwenden.
    Das steht aber auch so in der Hilfe.



  • Ich habe mich etwas ungenau ausgedrückt.

    Es existiert eine Klasse in der KONSTANTEN mit #if KONSTANTE abgefragt werden. An dieser fremnden Klasse will ich auch garnichts ändern.

    Um nun den Inhalt dieser if Abfrage auch nutzen zu können, muss ich im CBuilder unter Projektoptionen die KONSTANTEN bei den Bedingungen reinsetzen. Normal reicht in VisualC und anderen Compilern wohl nur die KONSTANTE einzufügen. In CBuilder muss ich jedoch ein =1 dazusetzen, da er sonst beim compilieren meckert, was mich wundert.

    Die Frage ist nun, ob man generell alle KONSTANTEN in CBuilder immer mit =1 eintragen muss. Wenn diese lediglich mit #if und ohne defined abgefragt werden.
    Wäre eigentlich auch logisch, da es dann ein true ergeben würde, aber andere Compiler fressen das auch ohne. 😉



  • Buildermann schrieb:

    Es existiert eine Klasse in der KONSTANTEN mit #if KONSTANTE abgefragt werden. An dieser fremnden Klasse will ich auch garnichts ändern.

    Das kann eigentlich nicht sein. Du kannst in eine Klasse keine Preprozessorkonstanten packen.
    Ansonsten, mach es doch mit dem =1.



  • Kommt ganz darauf an, was die fremde Klasse mit der Konstanten denn so alles anstellt. In der Regel ist es so, dass man per #ifdef das Vorhandensein eines Symbols überprüft und dann entsprechende Anweisungen ausführt.

    Beispiel:

    #ifdef UNICODE
    #define GetWindowText GetWindowTextW
    #else
    #define GetWindowText GetWindowTextA
    #endif
    [cpp]
    
    Im obigen Beispiel wird die Funktion GetWindowText entweder durch GetWindowTextW (Widestring Variante mit Unicodeunterstützung) oder durch GetWindowTextA (ASCII Variante ohne Unicodeunterstützung) definiert. Das #ifdef prüft einfach nur das Vorhandensein des UNICODE Symbols, ohne Rücksicht auf dessen Wert zu nehmen. Für den obigen Codeschnipsel sind diese #define Anweisungen alle identisch:
    
    [cpp]
    #define UNICODE                // Symbol UNICODE definieren
    #define UNICODE 0              // Symbol UNICODE als 0 definieren
    #define UNICODE "HELLO WORLD"  // Symbol UNICODE als "HELLO WORLD" definieren
    

    Anders sieht es aus, wenn in Abhängigkeit des Symbolwertes Anweisungen ausgeführt werden :

    #if LANGUAGE == 1
    #define LANG_NAME "Deutsch"
    #elif LANGUAGE == 2
    #define LANG_NAME "English"
    #elif LANGUAGE == 3
    #define LANG_NAME "French"
    #else
    #define LANG_NAME "Unknown"
    #endif
    

    Gruß,
    Doc


Anmelden zum Antworten