如何从包含的头文件中访问变量

时间:2016-05-13 11:18:19

标签: c++

我有三个文件,一个有要访问的变量,另外两个需要访问这些变量。现在我有三个文件如下,并在编译中收到错误,表示对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?

2 个答案:

答案 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;
    }

但你最好理解它!