undefinierter Verweis auf Array von Konstanten

8

a.cpp

%Vor%

a.h

%Vor%

b.cpp

%Vor%

Warum bekomme ich einen nicht definierten Referenzfehler? Ohne den const verschwindet der Fehler.

Wie teile ich ein Array von Konstanten zwischen mehreren Übersetzungseinheiten?

    
fredoverflow 30.05.2012, 12:34
quelle

5 Antworten

9

Dies ist eine der Eigenheiten, in die Leute geraten, es ist einfach eine Sache, dass Sie eine a.h-Header-Datei definiert haben, die ein const-Array von 123 Zeichen deklariert und ihr eine externe Verknüpfung zuweist. Wenn es in der b.cpp-Datei enthalten ist, versprechen Sie grundsätzlich den Compiler, den es in einer anderen Übersetzungseinheit finden wird.

Aber jede const Variable hat ein dunkles Geheimnis - sie ist innerhalb ihrer definierenden Übersetzungseinheit gefangen, weil sie implizit statische Verbindungen erhält. Sie haben versprochen, dass Ihr Compiler whatever für mehrere Übersetzungseinheiten freigegeben wird, aber er ist nur einer Übersetzungseinheit treu und möchte nicht geteilt werden. Und, nun, du kennst den Rest.

Lösen Sie durch explizites Angeben von extern in der Implementierungsdatei.

    
user1309389 30.05.2012, 13:00
quelle
4
%Vor%

Vars mögen

%Vor%

sind implizit als 'statisch' definiert.

Um sie nicht statisch (also nicht intern) zu machen, verwenden Sie den Modifizierer "extern" in der ".c" -Datei.

Versuchen Sie es mit

%Vor%     
Viktor Latypov 30.05.2012 12:41
quelle
1

const hat standardmäßig eine statische (interne) Verknüpfung in C ++, verwenden Sie auch extern const in Ihrer .c-Datei.
Dies ist ein zufälliger SO-Thread, der mehr Informationen enthält. Oder google "Verknüpfung in C ++".

    
Torp 30.05.2012 12:40
quelle
0

In C ++ ist const eine Kompilierungszeit const, zum Beispiel

%Vor%

können wir const verwenden, um das Array in C ++ zu definieren, aber nicht in C. Da es const ist, welcher Wert nicht geändert werden kann, muss er nicht zwischen mehreren Dateien geteilt werden. Also, um zu sagen, const hat interne Verknüpfung.

    
RolandXu 30.05.2012 14:03
quelle
0

Um das zu beheben, sollte a.cpp Folgendes tun:

%Vor%

vor der Definition von whatever .

Wenn es im Bereich keine vorherige Deklaration gibt, dann hätte const unsigned char whatever[123] = {...}; eine interne Verknüpfung. Wenn jedoch a.h enthalten ist, entspricht die Definition der vorherigen Deklaration. Der Header definiert whatever mit externer Verknüpfung und die Definition stimmt mit dem Namen überein.

Wie von anderen erwähnt, könnten Sie auch extern in die Definition einfügen, damit dieser Fehler nicht auftritt, wenn Sie #include "a.h" vergessen. Es ist jedoch immer noch die beste Vorgehensweise, die Header einzufügen, die alles deklarieren, was wir öffentlich definieren möchten.

    
M.M 08.02.2018 20:34
quelle

Tags und Links