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
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...
`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.
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.
> 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.