Изглежда не мога да препратя външно дефинирана променлива от пространство от имена, използвайки extern
. Работи от глобалния обхват, но веднага щом там бъде хвърлено пространство от имена, то не успява да се свърже.
Моят файл с константи изглежда така:
StringConstants.cpp
#include "MyString.h"
MyString test1("string1");
MyString test2("string2");
Основната програма изглежда така:
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());
}
Получавам подобни грешки както в GCC, така и в 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
Опитах се да квалифицирам препратката към test2 (extern MyString ::test2
), но тя просто смята, че test2 е статичен член на MyString. Именуваното пространство от имена не се държи по различен начин от анонимното. Поради различни причини не искаме да премахваме пространствата от имена или да поставяме екстерните извън пространствата от имена.
Ето и другите файлове за пълнота:
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
Целите на тази система са всички константи да бъдат дефинирани в един файл и да бъдат разрешени по време на свързване, вместо да бъдат в заглавка. Изглеждаше, че горният код ще работи, но тъй като е отхвърлен от два различни линкера, изглежда, че разбирането ми за C++ не е достатъчно добро. Съвет как да накарате това да работи, освен да поставите екстерните извън пространствата от имена?