Zwei Variablen gleichen Namens und Typs in zwei verschiedenen .c-Dateien werden mit gcc kompiliert

8

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?

    
johndoevodka 25.08.2011, 12:02
quelle

4 Antworten

18
  

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 .

    
cnicutar 25.08.2011, 12:05
quelle
2

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)

    
Abraham 04.11.2014 02:10
quelle
1
Die Ausgabedatei

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

    
user2858081 01.04.2014 06:34
quelle
0

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: -)

    
Ottavio Campana 25.08.2011 14:09
quelle

Tags und Links