Я не могу ссылаться на внешнюю переменную из пространства имен, используя 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 ++ недостаточно хорошее. Советы о том, как заставить это работать, кроме размещения внешних элементов вне пространств имен?