globale Variable V.S. Dateivariable in C ++

7

Was ist der Unterschied zwischen globaler Variable und Dateivariable in C ++?

Danke!

    
user36064 10.02.2009, 22:41
quelle

4 Antworten

12

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.

    
Dan Olson 10.02.2009 22:50
quelle
6

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.

    
UncleZeiv 10.02.2009 23:11
quelle
3

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

    
strager 10.02.2009 23:14
quelle
0

Der einzige Unterschied besteht darin, dass auf Dateivariablen nur innerhalb der Datei zugegriffen werden kann. Aber sie haben die gleiche Lebenszeit.

    
thinkbeforecoding 10.02.2009 22:47
quelle

Tags und Links