Forum: Compiler & IDEs Gleicher Labelname in 2 Dateien


von Oryx (Gast)


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

von OldBug (Gast)


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...

von Jörg Wunsch (Gast)


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.

von Fritz Ganter (Gast)


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.

von Jörg Wunsch (Gast)


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.

von Peter D. (peda)


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

von Jörg Wunsch (Gast)


Lesenswert?

Und wie hat der dann COMMON in FORTRAN abgehandelt? :-)

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.