C++ 重复符号问题

C++ 重复符号问题,c++,namespaces,C++,Namespaces,我有一个头文件MyNameSpace.h,我在其中使用名称空间,如下所示: namespace NameSpace1 { string first = "First"; ... } namespace NameSpace2 { string top = "Top"; } 但当我在其他类(包括头文件)中使用名称空间对象时。我得到了重复的符号错误,名称空间1::first。它的确切含义和解决方法。您不应该在标题中定义全局变量,您需要告诉编译器它是在其他地方用extern关键字定义的。否则,编

我有一个头文件MyNameSpace.h,我在其中使用名称空间,如下所示:

namespace NameSpace1

{
string first = "First";
...
}

namespace NameSpace2

{
string top = "Top";
}

但当我在其他类(包括头文件)中使用名称空间对象时。我得到了重复的符号错误,名称空间1::first。它的确切含义和解决方法。

您不应该在标题中定义全局变量,您需要告诉编译器它是在其他地方用
extern
关键字定义的。否则,编译器将尝试在包含头的每个源文件中定义变量

例如,在MyNameSpace.h中,您可以:

namespace NameSpace1 {
    extern std::string first;
}
然后在MyNameSpace.cpp中执行此操作:

namespace NameSpace1 {
    std::string first = "First";
}

首先,不能有名称空间对象,不能从名称空间创建对象。它仅用于名称解析。关于多定义问题,您很可能缺少了头文件的定义。

@reko\t:include-guard对多变量定义没有帮助,因为include-guard只保护每个编译单元(例如源文件)不包含多个变量


这实际上不是在阻止多个定义吗?

外部的意思是外部的吗?包含保护不帮助阻止多个变量定义,因为包含保护只保护每个编译单元(例如源文件)不被多个包含@reko_t:如果include-guard丢失,并且同一个头文件在一个翻译单元中包含了两次,则会出现多个重新定义错误。是吗?是的,这是真的,但只有当变量未使用
extern
声明时,使用
extern
的重复符号不会产生错误,即使没有包含保护。是的,我同意
extern
是比在头文件中使用全局变量更好的方法。不同的翻译单元之间会出现重复的符号定义。例如,如果你有
intfoo=10
在foo.h(带有include-guards)中,并且foo.h是从a.cpp和b.cpp中包含的,您将得到一个错误,表明foo被多次定义。原因是每个翻译单元的预处理器定义都会重置。