Hier ist der Deal. Ich hatte zwei identische globale Variablen in zwei verschiedenen .c-Dateien, sie wurden nicht als extern deklariert. Also sollte jede .c Datei ihre eigene Variable gesehen haben, oder?
Aber ich habe ein ziemlich merkwürdiges Verhalten bekommen, als ob eine Datei die andere Dateivariable gelesen hätte (nachdem ich sie verlinkt habe). Das Hinzufügen eines statischen Qualifiers zu beiden Variablendefinitionen scheint dieses Problem zu beheben.
Was ich mich eigentlich frage ist, was genau dort ohne den 'statischen' Qualifier passiert ist?
Also sollte jede .c Datei ihre eigene Variable gesehen haben, oder?
Falsch. In C bedeutet das Weglassen von static
von einer Deklaration implizit extern
linkage.
Von C In Kürze:
Der Compiler behandelt Funktionsdeklarationen ohne eine Speicherklasse Spezifizierer, als ob sie den Spezifizierer extern enthielten. Ähnlich, beliebig Objektbezeichner, die Sie außerhalb aller Funktionen und ohne angeben Ein Speicherklassenbezeichner hat
external linkage
.
IMMER Initialisierung der globalen Variablen, dann wird der Compiler seine Verknüpfung nicht automatisch als extern betrachten. Der Compiler gibt während der Kompilierung einen Fehler aus.
Dies wird dazu beitragen, zufällige Probleme in großer Code-Basis zu vermeiden, da unser Code eine andere deklarierte Variable verwenden kann, die einen zufälligen Wert hat (in unserer logischen Perspektive)
wird erzeugt, indem die Objektdatei der einzelnen Datei erstellt und dann durch Linker miteinander verknüpft wird. Wenn Sie jetzt eine identische Variable in zwei verschiedenen Dateien haben, wird die einzelne Datei ohne Fehler kompiliert, aber zum Zeitpunkt der Verknüpfung wird der Linker zwei Definitionen der Variablen erhalten und einen Fehler erzeugen. Aber im Falle des statischen Umfangs der beiden Variablen für die Datei so begrenzt, funktioniert alles gut. Ich hoffe, Sie finden das nützlich.
Soweit ich weiß, ist es Sache des Compilers, wenn Sie weder statisch noch extern angeben. Und gcc geht in diesem Fall nach extern, also müssen Sie in Ihrem Fall statisch angeben.
Ich hatte vor ein paar Jahren das gleiche Problem: -)