C++: Verknüpfung von extern-Variablen innerhalb eines namespace
Ich kann nicht scheinen, um die Referenz auf eine extern definierte variable in einem namespace mit extern
. Es funktioniert aus dem globalen Bereich, aber sobald ein namespace ist dort ausgelöst, es nicht zu verlinken.
Meine Konstanten-Datei sieht wie folgt aus:
StringConstants.cpp
#include "MyString.h"
MyString test1("string1");
MyString test2("string2");
Das main-Programm sieht wie folgt aus:
main.cpp
#include <stdio.h>
#include "MyString.h"
extern MyString test1;
namespace {
extern MyString test2;
}
int main(void) {
printf("%s\n", test1.Str());
printf("%s\n", test2.Str());
}
Bekomme ich ähnliche Fehler in den beiden GCC und Visual Studio:
gcc main.o StringConstants.o -o main
main.o:main.cpp:(.text+0x49): undefined reference to `(anonymous namespace)::test2'
collect2: ld returned 1 exit status
1>Linking...
1>main.obj : error LNK2001: unresolved external symbol "class MyString `anonymous namespace'::test2" (?test2@?A0x0df4aa01@@3VMyString@@A)
1>C:\p4\namespace_repro\namespace_repro2\Debug\namespace_repro2.exe : fatal error LNK1120: 1 unresolved externals
Ich habe versucht, die Qualifizierung der Verweis auf test2 (extern MyString ::test2
), aber er denkt nur, dass test2 ist eine statische member von MyString. Einem benannten namespace verhält sich nicht anders als eine anonyme eine. Aus verschiedenen Gründen, die wir nicht entfernen wollen, namespaces oder die externs, die außerhalb des namespaces.
Hier die anderen Dateien, für die Vollständigkeit:
MyString.h
class MyString {
public:
MyString(const char* str): mStr(str) {};
const char* Str() const { return mStr; }
private:
const char* mStr;
};
Makefile
CC=gcc
CFLAGS=-Wall
main: StringConstants.o main.o
Die Ziele für dieses system sind, dass die Konstanten, die alle definiert werden, in einer Datei, und dass Sie gelöst werden zur link-Zeit anstatt in einem header. Es schien wie der obige code würde funktionieren, aber da es abgelehnt, die von zwei verschiedenen linkern, es scheint mein Verständnis von C++ ist nicht gut genug. Ratschläge, wie diese zu arbeiten, andere als die externs, die außerhalb des namespaces?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies bedeutet, dass der name "test2" ist Teil der anonymen namespace und sollte in diesem namespace definiert, wenn es verwendet wird.
Ist es nicht ein Problem mit den anonymen namespace allein, sondern für diese Angelegenheit jedes namespace.
Was...
...tut, ist zu sagen, test2 vorhanden sein sollte, in einem anonymen namespace, aber es funktioniert nicht - es ist im globalen namespace. Sie haben gelogen, zu Ihrem compiler, daher erzeugt es ein Objekt, das nicht zu verknüpfen. Sie müssen die extern-Deklaration aus dem gleichen namespace-Gültigkeitsbereich wie die variable.
ABER, es sollte eine StringConstants.h, die main.cpp einschließen sollten, so dass die Zusammenstellung Gerät weiß über die Saiten, ohne weitere Erklärungen.
<iosfwd>
- es stellt die forward-Deklaration für Klassen in<iostream>
, doch gepflegt ist neben (und im Idealfall - vor allem in einem volatilen software-system - werden von ihm, um Konsistenz zu gewährleisten). Könnten Sie das nicht tun das gleiche: Sie haben extra extern-Deklaration Header für jeden client app / übersetzung-unit-logisch "unter" dem "all-strings" - header, mit dem letztere einschließlich der Ihnen um die Konsistenz zu prüfen...?