2009-02-10 14 views
7

Was ist der Unterschied zwischen globaler Variable und Dateivariable in C++?globale Variable V.S. Dateivariable in C++

Danke!

+0

Entschuldigung, meine Unwissenheit, aber ich komme aus aa hauptsächlich C/Objective C Hintergrund und ich habe noch nie von einer Dateivariablen gehört ... Do Sie meinen eine globale Variable, die nur in der definierten Datei sichtbar ist? – hhafez

+0

Klarstellung: Ich nehme an, Sie meinen, ob das Stichwort "statisch" verwendet wird oder nicht? (statische globale Variablen sind nur in dieser Datei sichtbar) –

Antwort

0

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

12

In C und C++ können Sie eine globale Variable nur über die Datei, in der sie deklariert ist, mit dem Schlüsselwort static vor der Deklaration aufrufen. 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.

+0

gilt das auch für benutzerdefinierte Klassen? Ich habe ein Objekt in Datei1 deklariert und möchte es in beiden Dateien (file1, file2), zugreifen Ich habe '#include file2.h' in file1 und 'class ClassName;' in file2 so dass es erkennen Klasse .. aber trotzdem gibt es mir einen Fehler !! – Katia

6

C++ - Programme werden jeweils eine Übersetzungseinheit kompiliert (im Prinzip bedeutet dies, dass jede CPP-Datei unabhängig kompiliert wird).

standardmäßig Variablen, die nicht const, Funktionen, die nicht inline und typedef s haben interne Bindung: Dies bedeutet, dass sie zu anderen Übersetzungseinheiten nicht sichtbar sind. Wenn andere Übersetzungseinheiten auf ein Symbol mit interner Verknüpfung verweisen (nach , das es deklariert, das das Schlüsselwort extern für Variablen erfordert), wird der Linker nicht in der Lage sein, sie zu finden.

Um explizit eine interne Verknüpfung zu erfordern, verwenden Sie das Schlüsselwort static oder besser unbenannte Namensräume.

3

Hinweis: Diese Regeln gelten für C++ genau so gut wie für C, wobei einige Aspekte mit dem Scoping von Klasse/Struktur/Namespace zu tun haben. (Ich habe nicht bemerkt, dass die Frage C++ war, nicht C.)

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 eine globale Variable in Ihrer C-Quelldatei erklären, wie folgt aus:

// fileA.c 
int hello = 42; 

void printMessage() { 
    printf("Hello, %d world(s)!\n", hello); 
} 

hello und printMessage exportiert werden. 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 Datei-lokale Variable wie folgt erklären:

// fileB.c 
static int world = 9001; 

static void messagePrint() { 
    printf("It's over %d!\n", world); 
} 

world und messagePrint sind nicht exportiert. Wenn eine C-Objektdatei ein Symbol mit dem Namen 'hello' anfordert, kann der Linker das nicht mit dem hello von fileB.c verbinden, da es in fileB.obj (oder was auch immer) keine Informationen darüber gibt. Wie kann messagePrint über world wissen, obwohl? Beide sind in der gleichen Übersetzungseinheit. Scope übernimmt hier. Ich bin sicher, dass Sie viele Informationen unter scope through Google finden werden.

(Hat der Name des Symbols den Funktion/Variablennamen-Standard in C? Ich weiß, dass es für C++ unterscheidet (wo es keine Standardisierung für Namensmangel gibt), weshalb ich ABI an erster Stelle erwähne.)

((wenn ABI der richtige Begriff, selbst? P))