Warum wird nicht extern auf eine statische Variable verlinkt?

Lesezeit: 3 Minuten

Benutzeravatar von Jared Pochtar
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?

Benutzeravatar von bmargulies
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:

  1. 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.
  2. extern int blah; — blah muss an anderer Stelle definiert werden und wird von dieser Datei referenziert.
  3. 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.
  4. 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!

Natürlich gibt es in der Praxis heutzutage andere Sichtweisen.  Insbesondere gibt es jetzt Scoping-Ebenen zwischen einer einzelnen Quelldatei und einem ganzen Programm;  die Ebene einer einzelnen gemeinsam genutzten Bibliothek ist nützlich (einstellbar durch Mechanismen wie GCC-Funktionsattribute).  Aber das ist nur eine Variation des Themas der nicht statischen Variablen;
behält die gleiche Interpretation wie zuvor.

Benutzeravatar von felknight

Teufelsnacht Laut MSDN-Dokumentation:

Beim Ändern einer Variablen gibt das Schlüsselwort static an, dass die Variable eine statische Dauer hat (sie wird zugewiesen, wenn das Programm beginnt, und wird freigegeben, wenn das Programm endet) und initialisiert sie auf 0, sofern kein anderer Wert angegeben wird.Beim Ändern einer Variablen oder Funktion im Dateibereich gibt das Schlüsselwort static an, dass die Variable oder Funktion über eine interne Verknüpfung verfügt (ihr Name ist außerhalb der Datei, in der sie deklariert ist, nicht sichtbar). Statisch (C++) auf MSDN

: Archiviert im Januar 2015; siehe auch die neueste Dokumentation:

statisch § Speicherklassen (C++) | Microsoft-Docs

1415860cookie-checkWarum wird nicht extern auf eine statische Variable verlinkt?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy