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?
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.
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%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.
Um das zu beheben, sollte a.cpp
Folgendes tun:
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.