extern, Verknüpfung und globale Variablen

9

In C ++ sagen wir, dass wir diese Header-Datei haben:

myglobals.h

%Vor%

und wir fügen es in mehrere Implementationsdateien ein, dann erhalten wir Kompilierungsfehler, da wir am Ende "monatsInYear" mehrmals definiert haben, einmal in jeder Datei, in der monatesInYear enthalten ist.

Fein. Also, wenn wir unseren Header ändern und unsere globale const wie folgt machen:

%Vor%

dann gehen unsere Kompilierungsfehler weg. Die Erklärung dafür, wie ich es verstehe, und wie gegeben hier zum Beispiel , dass das const-Schlüsselwort hier die Verknüpfung von monatesInYear zu internal ändert, was bedeutet, dass nun jede Kompilierungseinheit, die den Header enthält, nun eine eigene Kopie von hat die Variable mit interner Verknüpfung, daher haben wir nicht mehr mehrere Definitionen.

Nun wäre eine Alternative, die Variable nur im Header mit extern zu deklarieren, d. h .:

%Vor%

und definieren Sie es dann in einer der Implementierungsdateien, die den Header enthalten, d. h .:

%Vor%

und dann überall, wo es eine Variable mit externer Verknüpfung enthält.

Das ist in Ordnung, aber die Sache, über die ich etwas verwirrt bin, ist, dass die Verwendung von const eine interne Verknüpfung gibt, die das Problem behebt, und die Verwendung von extern gibt eine externe Verknüpfung, die das Problem ebenfalls behebt! Es ist so, als würde man sagen, dass jede Verbindung funktioniert, solange wir sie spezifizieren. Und wenn wir nur geschrieben haben:

%Vor%

war die Verknüpfung nicht schon extern? Aus diesem Grund hat das Hinzufügen von 'const' die Verknüpfung zu intern geändert?

Es scheint mir, dass der Grund, warum 'extern' hier das Problem behebt, nicht darin besteht, dass es uns eine externe Verbindung gibt (wir hatten das schon), sondern weil wir nur die Variable deklarieren können, ohne sie zu definieren es , was wir sonst nicht tun könnten, seit:

%Vor%

deklariert und definiert es, und da der Header automatisch eingefügt wird und der Code in die Implementierungsdatei kopiert wird, erhalten wir mehrere Definitionen. Umgekehrt, da extern wir es nur deklarieren können, enden wir jedes Mal mit mehreren Deklarationen, wenn wir den Header einschließen, was in Ordnung ist, da wir mehrere Deklarationen haben dürfen, nur nicht mehrere Definitionen.

Stimmt mein Verständnis hier? Tut mir leid, wenn das sehr offensichtlich ist, aber es scheint, dass extern mindestens drei Dinge tut:

  • gibt externe Verknüpfung an
  • erlaubt die Deklaration von Objekten, ohne sie zu definieren
  • gibt die statische Speicherdauer an

Aber viele Quellen, die ich betrachte, machen das nicht klar, und wenn wir darüber sprechen, extern zu verwenden, um "Mehrfachdefinitionsfehler" mit globalen Variablen zu stoppen, wird nicht klar, dass der Schlüssel die Trennung der Deklaration von der Definition.

    
lemondifficult 28.07.2015, 04:22
quelle

2 Antworten

2

Bei einer nicht const -Variable bewirkt extern , dass die Variable eine externe Verknüpfung hat (was der Standardwert ist), aber auch konvertiert die Definition in eine Deklaration if Es gibt keinen Initialisierer - dh extern int i; definiert nicht wirklich i . ( extern int i = 5; würde, und würde hoffentlich eine Compiler-Warnung generieren.)

Wenn Sie extern int monthsInYear; in mehrere Quelldateien schreiben (oder #include in sie, was äquivalent ist), definiert keine von ihnen es. int monthsInYear = 12; definiert nur die Variable in dieser Quelldatei.

    
immibis 28.07.2015, 04:37
quelle
1
  

Die Speicherklassenspezifizierer sind ein Teil des decl-specifier-seq einer Deklarationssyntax. Sie steuern zwei unabhängige Eigenschaften der durch die Deklaration eingeführten Namen: ihre Speicherdauer und ihre Verknüpfung.

     
  • extern - statische oder Thread-Speicherdauer und externe Verknüpfung
  •   

Das ist, was cppreference sagt, was perfekt zu Ihrem Verständnis passt.

    
Alexander Balabin 28.07.2015 07:21
quelle

Tags und Links