有人可以向我解释命名空间中变量的生命周期吗?假设我有以下文件:
file.h:
// ...
namespace variables{
int x, y;
}
file.cpp:
#include "file.h"
using namespace variables;
int main(){
...
}
x
和y
的范围是什么?我问,因为在我正在阅读的一本书(C ++ Primer Plus)中,作者推荐using namespace
内部函数,所以我认为它们是在using
命令的位置定义的。但是,当我这样做时:
B.h:
class B{
// class stuff
};
namespace variables{
int x, y;
}
然后在main.cpp
(主程序)和B.cpp
(类实现)中我添加了#include "B.h"
行,我得到一个错误,我有variables::x
的多个定义和variables::y
,即使任何文件中都没有using
。这是怎么回事?我混淆了两个不同的概念吗?
答案 0 :(得分:3)
如果您直接在命名空间中声明变量,就会像全局变量一样存在。
因此,适用于普通全局变量的规则也适用于那些:它们将在程序运行时存在,并且您不应在头文件中定义它们。
INCLUDE.H
namespace Variables
{
extern int x;
extern int y;
}
file.cpp
namespace Variables
{
int x;
int y;
}
撰写using namespace Variables
只会让您通过名称x
和y
访问这些变量,而无需使用Variables::
答案 1 :(得分:2)
命名空间对变量的生命周期有 no 影响,因此:
namespace variables{
int x, y;
}
#include "file.h"
using namespace variables;
int main(){
...
}
x和y的范围是什么?
这些变量是全局的,因此它们的生命周期等于整个应用程序的生命周期。
请记住,using namespace
只是在此命名空间的元素前面编写NamespaceName::
的快捷方式。
答案 2 :(得分:2)
我添加#include“B.h”行,我得到一个错误,我有变量:: x和variables :: y的多个定义,即使在任何文件中都没有使用。这是怎么回事?我混淆了两个不同的概念吗?
即使您没有显式导入命名空间,也会声明您的变量。关键字using
导入当前范围内的命名空间或特定名称,这样您就不必在X::
前面访问已定义的元素。
变量的生命周期不受名称空间的影响。