我对c ++相对较新,目前面临下述问题。请提供您的输入,以便更好地理解命名空间并解决此问题。
我已经在名称空间中将一个变量声明为头文件中的extern,例如a.h我在.cpp文件中包含此文件,说a.cpp并在同一名称空间中定义该变量。这很好用。 现在,我将此头文件包含在另一个.cpp文件中,例如b.cpp,并在另一个命名空间中使用此变量。这让我想到了变量' a'未在此范围内声明。我使用' using namespace'来包含命名空间。在b.cpp文件中。我仍然得到同样的错误。在b.cpp中使用表达式namespace :: variable会出现错误,即变量' a'不是该命名空间的成员。
以下是了解我的问题的代码段。
// a.h
namespace example1
{
extern int a;
}
// a.cpp
#include"a.h"
namespace example1
{
a = 10;
}
// b.cpp
#include"a.h"
namespace example2
{
a = 5; // error : 'a' not declared in this scope.
}
// b.cpp
#include"a.h"
using namespace example1;
namespace example2
{
a = 5; // error : 'a' not declared in this scope.
}
// b.cpp
#include"a.h"
namespace example2
{
example1::a = 5; // error : 'a' not a member of example1.
}
提前致谢。
此致 KARTHIK
答案 0 :(得分:0)
在a.h中你将变量声明为extern,因此定义必须出现在cpp文件中(翻译单元才是正确的):
// a.h
namespace example1
{
extern int a;
}
所以这里是你定义变量的文件:
// a.cpp
#include"a.h"
namespace example1
{
int a = 10;
}
现在使用a.cpp中定义的变量a
// b.cpp
#include"a.h"
namespace example2
{
void f(){
a = 5; // error : 'a' not declared in this scope.
}
}
实际上,a在名称空间example1中,a不是限定名称,编译器失败。 (编译器查找名称空间:: example2,其父名称为全局名称空间)
第二个例子:
// b.cpp
#include"a.h"
using namespace example1;
namespace example2
{
void f(){
a = 5;
}
}
这应该编译,因为现在a
在全局命名空间范围内可见。
但是,如果您现在仍然看到错误,它将处于链接阶段。在构建可执行文件之前,链接器将查找a
的定义,因此您还必须向他提供编译a.cpp的结果。例如,如果使用GCC,请使用此命令行c++ b.cpp a.cpp
进行编译。
这也适用于此示例:
// b.cpp
#include"a.h"
namespace example2
{
void f(){
example1::a = 5;
}
}
在这里执行限定名称查找,因此应该编译。如果发生错误,则应该在链接时,如上例所述。