命名空间中变量的生命周期

C++: life-cycle of variables in namespaces

本文关键字:生命 周期 变量 命名空间      更新时间:2023-10-16

谁能给我解释一下命名空间变量的生命周期?假设我有以下文件:

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::xvariables::y的多个定义,即使在任何文件中没有using。这是怎么回事?我是不是混淆了两个不同的概念?

如果您像以前那样直接在命名空间中声明变量,它们将仅仅作为全局变量存在。

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

include.h

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

file.cpp

namespace Variables
{
    int x;
    int y;
}

编写using namespace Variables将允许您通过名称xy访问这些变量,而不必在它们前面加上Variables::

命名空间对变量的生命周期没有影响,因此:

namespace variables{
    int x, y;
}
#include "file.h"
using namespace variables;
int main(){
    ...
}

x和y的作用域是什么?

这些变量是全局的,所以它们的生命周期等于整个应用程序的生命周期。

请记住,using namespace只是在此名称空间的元素前面编写NamespaceName::的快捷方式。

我添加了#include "B.h"行,我得到了一个错误,我有变量::x和变量::y的多个定义,即使没有在任何文件中使用。这是怎么回事?我是不是混淆了两个不同的概念?

即使没有显式导入命名空间,也会声明变量。关键字using在当前作用域中导入名称空间或特定名称,这样您就不必在X::前添加前缀来访问已定义的元素。

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