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 suchenmfg
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 intWas 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 -