Archiv verlassen und diese Seite im Standarddesign anzeigen : #ifndef und trotzdem "duplicate definitions"
Hallo,
ich hab mal wieder ein kleines Problem,
um eine doppeltes "includieren" einer Header Datei zu verhindern habe ich im Prinzip folgendes geschrieben:
#ifndef xxx
#define xxx
int myvar;
#endif
Solange ich es nur einmal im Hauptprogramm includiere, ist alles okay,
ich habe aber ein anderes Modul, wo es auch benutzt wird, dort wird es ebenfalls includiert.
Der Compiler meckert mich dann an
"duplicate definitions myvar"
wie kommt das denn ???? bzw. wie muss ich das abändern ?
Darf man in den #ifndef Block keine Variablen aufnehmen ?
Danke für Eure Hilfe.
Siro
radbruch
21.06.2011, 11:12
Hallo
Ich schreibe immer
#define xxx 1
Dann ist xxx als 1 definiert und #ifndef xxx erkennt das richtig.
Gruß
mic
um eine doppeltes "includieren" einer Header Datei zu verhindern habe ich im Prinzip folgendes geschrieben:Das verhindert ein mehrfaches Inkludieren in ein und dieselbe C-Datei.
ich habe aber ein anderes Modul, wo es auch benutzt wird, dort wird es ebenfalls includiert.
Der Compiler meckert mich dann an
"duplicate definitions myvar" Beim Fehler geht es darum, das eine Variable in mehreren C-Dateien definiert wurde.
Das Eine hat mit dem Anderen also rein gar nichts zu tun.
Darf man in den #ifndef Block keine Variablen aufnehmen ?Doch, aber es dürfen nur Deklarationen sein, keine Definitionen. Die Definition der Variable wird nur einmal gemacht, und zwar in einer C-Datei.
Ich schreibe immer
#define xxx 1
Dann ist xxx als 1 definiert und #ifndef xxx erkennt das richtig.
Sorry, aber das ist Unsinn. Zum einen hat Siros Problem nichts mit "Define richtig erkennen" zu tun, und zum anderen ist auch die Aussage selbst falsch. Die 1 (oder was auch immer) ist nicht notwendig, damit ein #ifdef (oder #ifndef) funktioniert. Ein "leeres" Define ist völlig ausreichend.
Danke zunächst für eure geteilten Meinungen.
Aber das löst nicht mein Problem.
Ich weis, das ich dem define xxx auch einen Wert zuweisen kann(aber nicht muss, wie "sternst" eben schrieb)
ich wollte bzw. habe aber eine Variable in dem Block definiert. Und das scheint der Compiler nicht zu mögen, was ich ehlich gesagt nicht verstehe.
Das define xxx wird doch nur einmal durchlaufen, dann is es definiert und dann dürfte der Compiler doch auch nicht versuchen erneut meine Variable anzulegen und deshalb eine Fehler verursachen.
Das ist doch eigentlich nur eine Anweisung für den Compiler, daß er den Block nicht weiter berücksichtigen soll, wenn xxx schon definiert wurde, damit müste doch eine doppel deklaration ausgeschlossen sein.
Das define xxx wird doch nur einmal durchlaufen, dann is es definiert und dann dürfte der Compiler doch auch nicht versuchen erneut meine Variable anzulegen und deshalb eine Fehler verursachen.
Das ist doch eigentlich nur eine Anweisung für den Compiler, daß er den Block nicht weiter berücksichtigen soll, wenn xxx schon definiert wurde, damit müste doch eine doppel deklaration ausgeschlossen sein.Aber nur in Bezug auf eine C-Datei. Beim Übersetzen der nächsten C-Datei interessiert es den Compiler einen feuchten Furz was beim Übersetzen der vorigen alles definiert war. Jede C-Datei wird separat (völlig getrennt von den anderen) übersetzt.
Außerdem ist es keine "doppel deklaration", sondern eine doppelte Definition. Das ist ja gerade der Knackpunkt, wäre es eine Deklaration, gäbe es kein Problem. Wenn dir der Unterschied nicht geläufig ist, ist es jetzt höchste Eisenbahn, das mal nachzuschlagen.
Das "ifndef" ist ja in der Include Datei ?
dann sollte das hinhauen. Verwend' ich, wie alle anderen, exzessiv, das muss passen.
aaaaaber "myvar" kann natürlich trotzdem irgendwo ein zweitesmal wo stehen (irrtümlicherweise).
Das "ifndef" ist ja in der Include Datei ?
dann sollte das hinhauen. Verwend' ich, wie alle anderen, exzessiv, das muss passen. Aber mit der Variablen-Definition darin und Verwendung in mehreren C-Dateien, funktioniert es dann nicht, weil es richtig wäre, sondern nur deshalb, weil der GCC-Linker per Default Mehrfach-Definitionen einfach stillschweigend zusammenlegt.
Achso, ich glaube jetzt verstehe ich es.
Da der Compiler jedes C-Modul separat compiliert und jeweils eine eigene Objekt Datei erstellt, haben beide Dateien dann "myvar".
Das tut erstmal noch keinem weh, aber wenn der Linker an die Reihe kommt, stellt er diesen Doppelbezug fest und meckert.
Es gibt zwei Objekt-Dateien mit jeweils einer eigenen Variablen Namens "myvar"
Klingt logisch.
Upps, Unterschied Definition / Deklaration ist aber auch verwirrend....
Ich dachte immer ein "define" ist eine Definition. (Allein schon wegen der Buchstabenfolge :-) Also eine Beschreibung ohne Speicherbedarf.
Dann ist also ein "define" eine Deklaration ?
dann wäre doch "ifdef" eigentlich "if declaration", sieht aber aus wie "if define" ???? was ja Speicher benötigen würde.
ein ifdef xxx benötigt doch aber keinen Speicher. Dann müste es korrekterweise "ifdecl" oder ähnlich heissen.
Hm, nicht ganz einleuchtend.....
Die Definition ist also all daß ,wo Speicher benötigt wird. Die Deklaration sagt nur aus, wie es aussieht.
Auf Delphi bezogen wäre also die Definition eine "Instanz" eines Objekts.
Ist das richtig so ?, ich hoffe ich habe nix durcheinandergebracht, außer mich selbst....
Siro
Upps, Unterschied Definition / Deklaration ist aber auch verwirrend....
Ich dachte immer ein "define" ist eine Definition. (Allein schon wegen der Buchstabenfolge :-) Also eine Beschreibung ohne Speicherbedarf.
Dann ist also ein "define" eine Deklaration ?
dann wäre doch "ifdef" eigentlich "if declaration", sieht aber aus wie "if define" ???? was ja Speicher benötigen würde.
ein ifdef xxx benötigt doch aber keinen Speicher. Dann müste es korrekterweise "ifdecl" oder ähnlich heissen.
Hm, nicht ganz einleuchtend.....Falsche Baustelle. Bei Deklaration/Definition geht es um C-Variablen. Was du da aufzählst sind Präprozessor-Direktiven. Das hat nichts miteinander zu tun.
Die Definition ist also all daß ,wo Speicher benötigt wird. Die Deklaration sagt nur aus, wie es aussieht.Ja.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.