Gleicher Labelname in 2 Dateien

Gast #99800
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
Gast
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...
Gast
`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.
Gast
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.
Gast
> 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.
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.