Gleicher Labelname in 2 Dateien

Gast #99800
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
Gast #99802
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.
Gast #99803
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.
Gast #99804
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.
#99805
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren