2013-02-20 8 views
10

ich wie so ein String-Konstante in einer API zur Verfügung stellen mag:extern const char * const SOME_CONSTANT gibt mir Linkerfehler

extern const char* const SOME_CONSTANT; 

Aber wenn ich es in meiner statischen Bibliothek Quelldatei als

const char* const SOME_CONSTANT = "test"; 
definieren

ich erhalte Fehler Linker bei der Verknüpfung gegen diese Bibliothek und mit SOME_CONSTANT:

Fehler 1 Fehler LNK2001: extern Symbol " char * const const SOME_CONSTANT“(? SOME_CONSTANT @@ 3QBDB)

den Zeiger const-heit (zweites Schlüsselwort const) sowohl von der extern const char* const Erklärung und die Definition macht es Arbeit zu entfernen. Wie kann ich es mit Zeiger Const-Ness exportieren?

+0

gut, sieht aus wie es sollte in Ordnung sein http://StackOverflow.com/Questions/2190919/Mixing-Extern-and-Const –

+0

Da Sie C++ getaggt haben, sollte eine "String-Konstante" überhaupt nicht "const std :: string" heißen? – Angew

+0

Ist die 'extern'-Deklaration auch in der Quelldatei sichtbar, die die Konstante definiert? – Angew

Antwort

11

könnte das Problem sein, dass die extern Erklärung ab, die Konstante nicht sichtbar in der Quelldatei ist. Versuchen Sie, die Erklärung über die Definition zu wiederholen, wie folgt aus:

extern const char* const SOME_CONSTANT; //make sure name has external linkage 
const char* const SOME_CONSTANT = "test"; //define the constant 
+0

Das funktioniert. Ich habe mich nur gefragt, wie der Linker weiß, dass er mein Symbol nicht ausziehen soll ... und dann habe ich deine Antwort gesehen und den Gesichtspalast: D Natürlich muss ich extern verlinken. – AndiDog

+3

@AndiDog Beachten Sie, dass dies derselbe ist, als würde man 'extern' nur zur Definition hinzufügen. Wie die andere Antwort nahelegt, bedeutet "const" in C++ "statisch". Sie müssen dem entgegenwirken und explizit auch "extern" in Ihrer Definition sagen. –

+1

„' const' in C++ bedeutet 'static' ... Das ist wie eine beliebige Hack scheint in C++ Spezifikation. Micro-Optimierung für faule Leute !!! – FooF

9

höchstwahrscheinlich vergessen Sie Ihre Header in Ihrer Implementierungsdatei enthalten

sowieso, fügen Sie das Schlüsselwort extern der Definition

ohne eine extern Erklärung es hat interne Verknüpfung und ist daher nicht für den Linker sichtbar

+0

Diese wahre scheint (mit den letzten 'gcc' in Linux getestet), +1 für Sie Warum ist das so Was die rational ist hier, um sicherzustellen, dass die Header-Datei Deklaration und Definition zu machen.? Irgendein Link zur Erklärung für dieses verblüffende Verhalten? – FooF

+0

die Begründung, warum nicht-'Extension'-Konstanten interne Verknüpfung in C++ haben, ich denke, es hat damit zu tun, unnötige Namenskollisionen und One Definition Regel Konflikte für die Verknüpfung zu vermeiden. C99 hat eine Funktion, die * wie * es ist, aber nicht genau die gleichen Regeln (ich bin mir nicht sicher über die Details). Im Wesentlichen bedeutet dies, dass Sie * Konstanten in Header-Dateien freier deklarieren und definieren können. Sie können in Betracht ziehen, Ihre konstante Definition in die Header-Datei zu verschieben und dann das 'extern' einfach wegzulassen. Sie können dann ein 'static' für ein gutes Maß hinzufügen, aber es ist nicht erforderlich: darum geht es. –

+0

Wie Sie erwähnen, gibt es immer die wohlbekannte Möglichkeit, 'static const char * const SOME_CONSTANT =" test ";' in der Header-Datei zu definieren. Oder wir könnten die Definition in den anonymen Namensraum in der Kopfzeile einfügen ... Das erscheint mir immer noch wie ein dummer Hack, der der Sprachdefinition unnötige Komplexität hinzufügt !!! Vielleicht ist es für Header-Dateien besser lesbar, die nicht mit "statischen" oder anonymen Namensraumumfängen überladen sind. – FooF