我似乎无法使用extern
从命名空间内引用外部定义的变量。它从全局范围起作用,但是一旦命名空间被抛出,它就无法链接。C++:链接命名空间内的外部变量
我的常量文件看起来像:
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和视觉类似的错误工作室:
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" ([email protected][email protected]@[email protected]@A)
1>C:\p4\namespace_repro\namespace_repro2\Debug\namespace_repro2.exe : fatal error LNK1120: 1 unresolved externals
我试着限定引用test2(extern MyString ::test2
),但它只是认为test2是MyString的静态成员。命名命名空间的行为与匿名行为不同。由于各种原因,我们不想删除名称空间或将名字空间外的extern。
这里的其他文件,完整性:
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++的理解还不够好。除了将外部名称放在命名空间之外,还有关于如何实现这一功能的建议?
*叹*我想我不能不同意这个规范,我多次看过那个部分, t解析该特定行的含义,谢谢拼写。 – breath 2010-11-18 03:17:30