In C und C ++ können Sie eine globale Variable nur über die Datei aufrufen, in der sie deklariert ist, indem Sie vor der Deklaration das Schlüsselwort static verwenden. Globals, die das static-Schlüsselwort nicht verwenden, können von jeder C- oder C ++ - Datei aus aufgerufen werden, die in das Programm kompiliert wurde.
Die statische globale Methode ist in C ++ zugunsten anonymer Namespaces veraltet. Alle Deklarationen, die in einem anonymen Namespace platziert werden, sind auch nur innerhalb dieser Datei zugänglich.
C ++ - Programme werden jeweils eine Übersetzungseinheit kompiliert (im Prinzip bedeutet dies, dass jede CPP-Datei unabhängig kompiliert wird).
Standardmäßig haben Variablen, die nicht const
sind, Funktionen, die nicht inline
und typedef
s sind, interne Verknüpfungen : Dies bedeutet, dass sie für andere Übersetzungseinheiten nicht sichtbar sind. Wenn sich andere Übersetzungseinheiten auf ein Symbol mit interner Verknüpfung beziehen (nach Deklaration , was das Schlüsselwort extern
für Variablen erfordert), kann der Linker sie nicht finden.
Um explizit eine interne Verknüpfung zu verlangen, verwenden Sie das Schlüsselwort static
oder besser unbenannte Namespaces.
Hinweis: Diese Regeln gelten für C ++ genauso gut wie für C, wobei einige Aspekte im Zusammenhang mit dem Klassen- / Struct- / Namespace-Scoping stehen. (Ich habe nicht bemerkt, dass die Frage C ++ und nicht C war.)
Denken Sie daran, dass (in den meisten Fällen) C-Quelldateien in Objektdateien kompiliert werden. Objektdateien haben eine 'export'-Tabelle, die dem Linker (wenn er verlinkt) sagt, welche Symbole er anbietet. Ein Symbol ist ein Name (der genaue Name hängt vom ABI ab), der sich auf eine Funktion oder Variable bezieht (in den meisten Fällen).
Wenn Sie in Ihrer C-Quelldatei eine globale Variable wie folgt deklarieren:
%Vor% hello
und printMessage
werden exportiert. Wenn eine C-Objektdatei ein Symbol mit dem Namen ' hello
' anfordert (unter der Annahme eines einfachen ABI), verbindet der Linker diesen mit dem von hello
exportierten fileA.c
.
Jetzt für den anderen Fall. Wenn Sie eine lokale Datei wie folgt deklarieren:
%Vor% world
und messagePrint
werden nicht exportiert. Wenn eine C-Objektdatei ein Symbol mit dem Namen ' hello
' anfordert, kann der Linker das nicht mit hello
von fileB.c
verbinden, da es keine Informationen in fileB.obj
(oder was auch immer) gibt.
Wie kann messagePrint
jedoch über world
wissen? Beide sind in der gleichen Übersetzungseinheit. Scope übernimmt hier. Ich bin sicher, dass Sie viele Informationen zum Geltungsbereich über Google finden werden.
(Ist der Symbolname mit dem Funktions- / Variablennamen-Standard in C identisch? Ich weiß, dass es für C ++ anders ist (wo es keine Standardisierung für Namensfehlern gibt), weshalb ich ABI an erster Stelle erwähne.)
((Wenn ABI der richtige Ausdruck, gerade?; P))
Der einzige Unterschied besteht darin, dass auf Dateivariablen nur innerhalb der Datei zugegriffen werden kann. Aber sie haben die gleiche Lebenszeit.
Tags und Links c++ global-variables