-         

Ergebnis 1 bis 10 von 10

Thema: #ifndef und trotzdem "duplicate definitions"

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.11.2007
    Ort
    Berlin
    Beiträge
    522

    #ifndef und trotzdem "duplicate definitions"

    Anzeige

    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

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    Ich schreibe immer

    #define xxx 1

    Dann ist xxx als 1 definiert und #ifndef xxx erkennt das richtig.

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von Siro Beitrag anzeigen
    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.

    Zitat Zitat von Siro Beitrag anzeigen
    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.


    Zitat Zitat von Siro Beitrag anzeigen
    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.
    MfG
    Stefan

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von radbruch Beitrag anzeigen
    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.
    MfG
    Stefan

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.11.2007
    Ort
    Berlin
    Beiträge
    522
    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.

  6. #6
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von Siro Beitrag anzeigen
    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.
    MfG
    Stefan

  7. #7
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    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).
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  8. #8
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von PicNick Beitrag anzeigen
    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.
    MfG
    Stefan

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.11.2007
    Ort
    Berlin
    Beiträge
    522
    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
    Geändert von Siro (21.06.2011 um 16:41 Uhr)

  10. #10
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von Siro Beitrag anzeigen
    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.


    Zitat Zitat von Siro Beitrag anzeigen
    Die Definition ist also all daß ,wo Speicher benötigt wird. Die Deklaration sagt nur aus, wie es aussieht.
    Ja.
    MfG
    Stefan

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 15.06.2011, 22:18
  2. Geschwindigkeitsmesser "testen" / "prüfen"
    Von Goblin im Forum Sensoren / Sensorik
    Antworten: 7
    Letzter Beitrag: 12.04.2011, 10:53
  3. "Soft-Reset?" und "Finger-Interrupt?"
    Von trapperjohn im Forum Asuro
    Antworten: 8
    Letzter Beitrag: 11.06.2008, 00:02
  4. "HCF 4096 BE" und "HCF 4095 BE" seriell-
    Von Bastler5 im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 15.05.2005, 14:23
  5. ASM: was machen "swap" und "cbr" genau?
    Von RHS im Forum AVR Hardwarethemen
    Antworten: 3
    Letzter Beitrag: 18.08.2004, 18:16

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •