我有三个文件,一个有要访问的变量,另外两个需要访问这些变量。现在我有三个文件如下,并在编译中收到错误,表示对i的未定义引用。我无法理解为什么使用命名空间给出错误?
header.h
extern int i;
a.cpp
#include "header.h"
#include "mheader.h"
namespace s{
int i=10;
struct p{
p(){
}
};
}
b.cpp
#include "a.cpp"
int main(){
cout<<i;
}
即使我在开始命名空间声明之前定义了变量i,也无法在命名空间内访问它。有没有办法可以访问命名空间内的变量以及b?
答案 0 :(得分:2)
命名空间是名称的单独空格。除非另有说明,否则一个名称空间中的名称引用的变量(或类型或其他)与另一个名称空间中的名称完全不同。
在全局命名空间中声明的 extern int i
(完全限定名称为::i
)是与命名空间int i
中定义的s
不同的变量(完全限定名称为{{1} }})。
因此,您从未定义在header.h中声明并在b.cpp中使用的s::i
根据您的意图,有两种可能的解决方案。您可以在a.cpp或b.cpp中的全局命名空间中定义::i
。在这种情况下,您可能想要摆脱显然未在任何地方使用过的int i
。
或者,您可以在b.cpp中使用s::i
。在这种情况下,您可能想要删除不再在任何地方使用的s::i
声明。
作为旁注,包括a.cpp很可能是一个错误。如果您尝试将从a.cpp和b.cpp编译的目标文件链接在一起,那么您将违反一个定义规则。
答案 1 :(得分:1)
你可以这样解决。
<强> header.h 强>
namespace s
{
extern int i;
}
<强> b.cpp 强>
#include "a.cpp"
int main()
{
cout<<s::i;
}
但你最好理解它!