Konstanten usw. bedingt einschließen



  • Hallo Gemeinde!

    Ich habe eigentlich schon ganz gute Erfahrungen mit C - für meine Verhältnisse und nach Knobeln läuft auch jedes Programm. Aber nun komme ich zu einem Problem, was ich bisher immer (mit Absicht) ausgeschlossen habe:

    Die Bedingte Compilierung. 😡

    Also ich habe jetzt nämlich das Problem, dass ich in einer Bibliothek Konstanten aus der Headerdatei benutze und die ist ja auch in der "main"-c inkludiert. Daher meckert mein Compiler jetzt, da ich die Konstanten doppelt definiere.

    Mit welcher Syntax kann ich erreichen, dass er die Dinger nur einmal "lernt" und beim zweiten Mal überspringt?

    Bsp.:

    [Was muss hier hin???]
    MAXWORDLENGHT=200;
    [Was muss hier hin???]

    Danke an alle, die mir helfen können...

    - stevieboy -



  • evtl. so : ?

    #ifndef GUARD
    #define GUARD
    
    // sonstige angaben
    
    #endif
    

    oder im Zweifel auch so (umständlich):

    #ifndef CONST1
    #define CONST1 1
    #endif 
    
    #ifndef CONST2
    #define CONST2 2
    #endif 
    .
    .
    .
    

    wobei's vermutlich besser is, wenn du statt definierten Konstanten richtige
    Konstanten nimmst:

    const int CONST3 = 3;
    

    Die Gründe stehn auch hier irgendwo im Forum, aber
    ich mag grad ned suchen 😉

    mfg
    Martin



  • Danke für die schnelle Antwort.

    Nur um das richtig zu verstehen:

    #ifndef MEINEKONSTANTEN
    #define MEINEKONSTANTEN
    
    const int MAXWORDLENGTH=100;
    const int MAXWORDS=20;
    //usw....
    
    #endif
    

    So einfach??? 😮

    - stevieboy -



  • Nein. Die Include-Guards helfen dir nicht weiter, wenn du dieselbe Headerdatei in mehrere c-Dateien einbeziehst.

    Such mal nach extern.



  • Hmmm,ich mach wohl was falsch.

    Da ich Konstanten habe, möchte ich Sie natürlich auch gleich initilisieren.

    Dann meckert aber der Compiler rum, wenn ich Sie so schreibe:

    #ifndef MEINEKONSTANTEN
    #define MEINEKONSTANTEN
    
    extern const int MAXWORDLENGTH=100;
    extern const int MAXWORDS=20;
    //usw....
    
    #endif
    

    Warnung: initialisieren und extern passt nicht zusammen. (frei übersetzt).

    Hmpf, und nun? 😕

    - stevieboy -



  • Wenn du extern benutzt, hast du nur eine Deklaration. Du musst die Konstante dann auch noch in einer Quellcodedatei definieren. Da kannst du sie dann auch initialisieren.



  • Also ich habe es jetzt so gemacht:

    in der Header-Datei, die 2x inkludiert wird:

    #ifndef MY_CONSTANTS
    #define MY_CONSTANTS
    	extern const int MAXPATHLENGTH;
    	extern const int MAXWORDLENGTH;
    #endif
    

    in der Datei, die main drin ist:

    MAXPATHLENGTH=200;
    MAXWORDLENGTH=100;
    

    Damit ist mein Compiler aber nicht einverstanden:
    in der Header-Datei: previous declaration
    in der main.c: kollidierender datentyp, defaults to int

    Was mache ich falsch? Ich will auf jeden Fall Konstanten und keine glob. Variablen nutzen.

    - stevieboy -



  • Du brauchst zwei Dateien, eine Header und eine Source.
    In der Header steht folgendes:

    #ifndef MY_CONSTANTS
    #define MY_CONSTANTS
        extern const int MAXPATHLENGTH;
        extern const int MAXWORDLENGTH;
    #endif
    

    In der Source-Datei (extra Datei!)

    const int MAXPATHLENGTH = 200;
    const int MAXWORDLENGTH = 100;
    

    Diese zusätzliche Source-Datei musst du natürlich deinen Projektdateien hinzufügen bzw. beim Compilieren auch mitcompilieren mit all deinen Dateien.



  • Asooo!!!

    Wie oben geschrieben habe ich in meinem Source-File das "const int" nicht nochmal geschrieben.

    Na dann ist ja alles klar! 👍

    Vielen Dank...

    - stevieboy -


Anmelden zum Antworten