2013-04-05 3 views
15

Ich habe Schwierigkeiten zu verstehen, wie 'extern' funktioniert. Ich habe Google gesucht, aber es scheint nicht das spezielle Beispiel Fall zu sein ichDie Verwendung von extern in C++

bin versucht, wenn ich eine Datei main.cpp haben die Referenzen one.h und darin ich eine Liste mit dem Namen LIST1 haben (Das ist ein Doppel-Array von 100 x 100) so habe ich doppelte List1 [100] [100];

Wie kann ich diese Liste in one.cpp bitte verwenden?

extern double LIST1[100][100] 

nicht funktioniert:/

main.cpp:

#include "one.h" 

extern double LIST1[100][100]; 

one.cpp:

void one::useList() 
{ 
for(j = 0; j < 100; j++) 
    { 
    for(i = 0; i < 100; i++) 
    { 
     LIST1[j,i] = 0.5; 
    } 
} 
} 

Dies ist, was ich habe.

Fehler Ich erhalte:

1> main.obj: Fehler LNK2001: extern Symbol "double (* LIST1) [100]" (Liste1 @@ 3PAY0GE @ NA?)

+1

Können Sie deutlich angeben, welchen Code Sie in welcher Datei haben. Ihre aktuelle Beschreibung ist eher verwirrend. – NPE

+1

und bitte definieren "nicht funktioniert" – infiniteRefactor

+0

'LIST1 [j, i] = 0,5;' sollte auch einen Fehler geben - Sie bedeutet 'LIST1 [j] [i] = 0,5;' –

Antwort

21

In C++, wie C davor, wird jede Quelldatei in eine Objektdatei kompiliert. Dann werden alle Objektdateien verknüpft, um das ausführbare Programm zu erstellen.

Um Symbole (Funktionen, globale Variablen) zu teilen, gibt es mehrere Schlüsselwörter, die dem Compiler mitteilen, welche Dateien lokal sind, welche privat sind und welche aus anderen Dateien importiert werden.

Das Schlüsselwort `extern 'bedeutet, dass auf ein Symbol zugegriffen werden kann, aber nicht definiert ist. Es sollte (als globales) in einem anderen Modul definiert werden. Wenn nicht, erhalten Sie bei der Link-Zeit einen 'undefinierten Symbol' Fehler.

29

Eine Variablendeklaration im Namensraumbereich ist immer eine Definition , es sei denn Sie setzen extern darauf; dann ist es nur eine Erklärung.

Eine wichtige Regel in C++ ist, dass Sie nicht mehrere Definitionen von Objekten mit demselben Namen haben können. Wenn Ihre Header-Datei nur double LIST1[100][100]; enthält, würde dies funktionieren, solange Sie es nur in eine Übersetzungseinheit aufgenommen haben. Sobald Sie jedoch die Header-Datei in mehrere Übersetzungseinheiten eingefügt haben, haben Sie mehrere Definitionen von LIST1. Du hast die Regel gebrochen!

Um eine globale Variable von mehreren Übersetzungseinheiten aus zugänglich zu machen, müssen Sie sicherstellen, dass nur eine Deklaration in der Header-Datei vorhanden ist. Wir tun dies mit extern:

extern double LIST1[100][100]; 

Sie können jedoch nicht nur den Header enthalten und versuchen, dieses Objekt zu verwenden, da es noch keine Definition ist. Diese LIST1 Erklärung besagt nur, dass ein Array dieses Typs irgendwo existiert, aber wir müssen es tatsächlich definieren, um das Objekt zu erstellen.So in einer einzigen Übersetzungseinheit (eine Ihrer .cpp Dateien in der Regel), müssen Sie setzen:

double LIST1[100][100]; 

nun jede Ihrer .cpp-Dateien kann die Header-Datei enthalten und immer nur die Erklärung bekommen. Es ist völlig in Ordnung, mehrere Deklarationen in Ihrem Programm zu haben. Nur ein Ihrer .cpp Dateien werden diese Definition haben.