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?

InformationsquelleAutor breath | 2010-11-18
Schreibe einen Kommentar