www.mikrocontroller.net

Forum: Compiler & IDEs Gleicher Labelname in 2 Dateien


Autor: Oryx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich hatte folgendes Problem:

in Datei1 ist ein Array char senden[20]

in datei2 ist ein unsigned char senden.

Die beiden Namen sind zufällig gleich gewesen. Von Linker kam keine
Warnung, das der gleiche Labelname zweimal verwendet wird. Ein extern
habe ich nicht verwendet.

Ich habe das gleiche in der C++ Variante getestet. Da kam eine
Warnung.
Kann ich solche Warnungen auch im C bekommen oder habe ich schon
zulange C++ gemacht (dann weiss ich jetzt auch wieder warum)?

Ach ja, Compiler ist die neueste WinAvr. Sollte in diesem Fall aber
fast egal sein.

Oryx

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So lange Du keine Referenz auf eine Globale Variable überschreibst,
kannst Du diesen Namen so oft verwenden, wie Du willst.
Jedes Objekt wird ja für sich kompiliert.

Gruß,
Patrick...

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
`typesafe linkage' ist ja auch ein Stichwort für C++.  Warum
eigentlich eine Warnung?  Dort müßten das nach meinem Dafürhalten zwei
verschiedene Objekte sein.

Bei C kannst Du nichts dergleichen bekommen, weil der Linker keine
Typinformation mitgeliefert bekommt.  Lediglich die Objektgröße
bekommt er noch, so daß er Dir eine Warnung geben sollte, wenn beide
C-Programme da unterschiedlich große Objekte angelegt haben.

Abhilfe: man sollte sich angewöhnen, alle Objekte, die nur innerhalb
eines Übersetzungsmoduls benötigt werden, auch `static' zu
deklarieren.  Damit sind sie für dieses Modul privat und gekapselt von
denen der anderen Module.

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eigentlich müsste der Linker einen Fehler liefern, wenn weder static
noch extern verwendet werden.
Soweit ich weiss, wird beim Linken in C der Typ nicht unterschieden,
sollte also 2 mal die selbe Variable vorhanden sein.

Schau dir mal mit "avr-nm *.o" wie die Variablen in den Objekt-Files
heissen.

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Eigentlich müsste der Linker einen Fehler liefern, wenn weder static
> noch extern verwendet werden.

-fno-common

,,Ganz früher'' gab es offenbar noch kein `extern' Schlüsselwort,
und
es hat sich von daher die Unsitte in C eingebürgert, daß man in zwei
Dateien dasselbe Objekt nicht nur (`extern') deklarieren sondern auch
definieren kann, wobei der Linker beide Definitionen vereinigt.  Man
hat sich dabei das COMMON-Block-Feature aus FORTRAN-Zeiten zunutze
gemacht.

GCC tut das standardmäßig.  Mit -no-common schaltet man das Feature
ab.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also beim Keil C51 gibts dafür vom Linker die rote Karte:

*** ERROR 104: MULTIPLE PUBLIC DEFINITIONS
    SYMBOL:  II


Und hat man 2 gleichnamige Funktionen, gibts zusätzlich auch noch eine
Warnung:

*** WARNING 16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?_PUTCHAR?TEST

weil die weiter hinten stehende Funktion ja nie aufgerufen wird.


Peter

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie hat der dann COMMON in FORTRAN abgehandelt? :-)

Siehe oben: wer das bei GCC haben möchte, kann das auch gern haben.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.