Warum wird nicht extern auf eine statische Variable verlinkt?
Lesezeit: 3 Minuten
Jared Pochtar
Warum tut extern int n nicht kompilieren, wenn n deklariert ist (in einer anderen Datei) static int nfunktioniert aber, wenn deklariert int n? (Beide Erklärungen befanden sich im Aktenbereich.)
Im Grunde, warum ist int n im Dateibereich nicht dasselbe wie static int n im gleichen Umfang? Nur in Bezug auf extern? Wenn ja, was über extern übersehe ich?
bmargulies
Der ganze und ganze Zweck von static ist zu deklarieren, dass eine Variable ist private in die Quelldatei, in der es deklariert ist. Somit erfüllt es genau seine Aufgabe, eine Verbindung von außen zu verhindern.
Denken Sie daran, dass es vier Varianten der Variablendefinition im Dateibereich gibt:
int blah = 0; — blah ist in dieser Datei definiert und von anderen Dateien zugänglich. Definitionen in anderen Dateien sind Duplikate und führen zu Fehlern.
extern int blah; — blah muss an anderer Stelle definiert werden und wird von dieser Datei referenziert.
int blah; — Dies ist das moralische Äquivalent von FORTRAN COMMON. Sie können eine beliebige Anzahl davon in Dateien haben, und sie werden alle vom Linker zu einem freigegebenen aufgelöst int.
static int blah;static TYPE blah;(optional mit einem Initialisierer) – Dies ist statisch. Es ist völlig privat zu dieser Datei. Es ist für Externe in anderen Dateien nicht sichtbar, und Sie können viele verschiedene Dateien haben, die alle deklarieren und das sind sie alleanders
. Für die Puristen im Publikum: ‘file’ =Kompilationseinheit
. static int bleh = 0; Beachten Sie, dass statische Inside-Funktionen (nicht im Dateibereich) einen noch engeren Geltungsbereich haben: wenn zwei Funktionen deklarieren
selbst in derselben Datei sind sie nicht miteinander verbunden. int blah = 0;int blah; Hinweis: für diejenigen unter Ihnen, die sich nicht auskennen: Nach dem üblichen Muster muss eine Kompilationseinheit eine globale Variable definieren, und andere können darauf verweisen. Es „lebt“ in dieser Kompilationseinheit. Im obigen Fall (3) wird es von keiner Datei (oder allen Dateien) definiert. Wenn zwei Dateien sagen int , wird sich der Linker über mehrere Definitionen beschweren. Wenn zwei Dateien sagen
Der Linker erstellt fröhlich eine einzige globale
und bewirkt, dass sich der gesamte Code darauf bezieht.
wie würde dann ‘int n’ (im Dateibereich) in Bezug auf Speicherbezeichner heißen?
– Jared Pochtar
15. Mai 2010 um 21:15 Uhr
@bmargulies: Meinst du im Dateibereich? Denn im Funktionsbereich behält eine statische Variable ihren Wert bei, nachdem die Funktion zurückgegeben wurde, und im Klassenbereich verfügt ein statisches Element über eine einzige Instanz, die allen Objekten zur Verfügung steht.
– Mingos
15. Mai 2010 um 21:16 Uhr
@Jared – ich nenne es “üblich”. Nach meiner Erinnerung definiert die Sprache kein Schlüsselwort, um dies explizit zu machen. Wenn ich falsch liege, vertraue ich darauf, dass mich jemand korrigieren wird.
– bmargulies
15. Mai 2010 um 21:19 Uhr
@bmargulies: OK, ich dachte in C++ statt in C. Danke.
– Mingos
15. Mai 2010 um 21:21 Uhr
hehe. Sie haben “klargestellt”, indem Sie auf ein analoges Fortran-Konstrukt hingewiesen haben. Ich glaube nicht, dass viele SO-Benutzer mit Fortran herumgespielt haben. 🙂
– Stefan static 15. Mai 2010 um 22:01 Uhr extern In Standard-C gibt es zwei Geltungsbereiche für außerhalb einer Funktion deklarierte Variablen. EIN extern static Variable ist nur innerhalb der Kompilierungseinheit (dh Datei) sichtbar, die sie deklariert hat, und nicht statische Variablen sind im gesamten Programm sichtbar. Ein
Die Deklaration besagt, dass der Speicherort der Variablen noch nicht bekannt ist, aber vom Linker aussortiert wird; es ist kompatibel mit nicht statischen Variablen, aber static ist nur verrücktes Gerede!