C ++:名称空间中变量的生命周期

时间:2013-03-29 04:56:48

标签: c++ namespaces

有人可以向我解释命名空间中变量的生命周期吗?假设我有以下文件:

file.h:

// ...
namespace variables{
    int x, y;
}

file.cpp:

#include "file.h"
using namespace variables;

int main(){
    ...
}

xy的范围是什么?我问,因为在我正在阅读的一本书(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。这是怎么回事?我混淆了两个不同的概念吗?

3 个答案:

答案 0 :(得分:3)

如果您直接在命名空间中声明变量,就会像全局变量一样存在。

因此,适用于普通全局变量的规则也适用于那些:它们将在程序运行时存在,并且您不应在头文件中定义它们。

INCLUDE.H

namespace Variables
{
    extern int x;
    extern int y;
}

file.cpp

namespace Variables
{
    int x;
    int y;
}

撰写using namespace Variables只会让您通过名称xy访问这些变量,而无需使用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::前面访问已定义的元素。

变量的生命周期不受名称空间的影响。