0

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

文件.h:

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

文件.cpp:

#include "file.h"
using namespace variables;

int main(){
    ...
}

x和的范围是y什么?我问是因为,在我正在阅读的一本书(C++ Primer Plus)中,作者推荐了using namespaces 内部函数,所以我认为它们是在using命令点定义的。但是,当我这样做时:

乙:

class B{
     // class stuff
};

namespace variables{
    int x, y;
}

然后在main.cpp(主程序)和B.cpp(类实现)中添加该#include "B.h"行,我得到一个错误,我有多个定义variables::xand variables::y,即使using在任何文件中都没有。这是怎么回事?我是否混淆了两个不同的概念?

4

3 回答 3

4

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

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

包括.h

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

文件.cpp

namespace Variables
{
    int x;
    int y;
}

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

于 2013-03-29T05:00:40.917 回答
2

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

namespace variables{
    int x, y;
}

#include "file.h"
using namespace variables;

int main(){
    ...
}

x 和 y 的范围是什么?

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

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

于 2013-03-29T04:58:51.147 回答
2

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

即使您没有显式导入命名空间,您的变量也会被声明。关键字using导入当前范围内的命名空间或特定名称,这样您就不必预先X::访问已定义的元素。

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

于 2013-03-29T05:02:00.893 回答