命名空间中变量的生命周期
C++: life-cycle of variables in namespaces
谁能给我解释一下命名空间变量的生命周期?假设我有以下文件:
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
。这是怎么回事?我是不是混淆了两个不同的概念?
如果您像以前那样直接在命名空间中声明变量,它们将仅仅作为全局变量存在。
因此,适用于普通全局变量的规则也适用于这些全局变量:只要程序运行,它们就会存在,并且您不应该在头文件中定义它们。
include.h
namespace Variables
{
extern int x;
extern int y;
}
file.cpp
namespace Variables
{
int x;
int y;
}
编写using namespace Variables
将允许您通过名称x
和y
访问这些变量,而不必在它们前面加上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::
前添加前缀来访问已定义的元素。
变量的生命周期不受命名空间的影响
- 如何在共享库的整个生命周期内存储数据
- 如何理解句子的生命周期始于对e的评估
- 它解决了什么问题,对于非真空初始化,生命周期在初始化之前就开始了
- Go/C++gRPC客户端通道和存根生命周期
- 如何将"this"的生命周期移动到C++中的另一个对象中?
- 是否可以通过使用移动/交换 c++11 来延长返回的临时变量的生命周期
- 使用对象的生命周期作为设置器的安全性
- 临时人员的生命周期传递给函数
- 我想知道在构造函数中初始化变量时的生命周期
- Lua 用户数据生命周期管理
- 如何使用 epoll(void* event.data.ptr) 管理 Connection 的生命周期
- C++引用的生命周期
- 在堆栈上有一个对象,而不是在函数的整个生命周期内
- 在 Boost ASIO 服务器中处理生命周期
- C++ lambda 生命周期
- 使用互斥锁跟踪另一个应用的生命周期
- QSharedPointer 或 std::shared_ptr 的生命周期
- 来自async_resolve的 boost::asio::ip::tcp::resolver::iterator 的生命周期是多久?
- 如何调整属于类的唯一指针的字符数组的大小.它必须在程序的整个生命周期中保持活力
- 延长 std::tuple<int&,int> 的生命周期,方法是将其分配给 const std::tuple<int, int>&