(匿名)命名空间、函数和头文件
(Anonymous) Namespaces, Functions, and Header Files
不确定以前是否有人问过这个问题。我四处寻找,找不到我的场景的确切答案,但我可能错过了它。
问题:我在头文件中有一个命名空间,并且在头文件的命名空间中有一些函数原型:
namespace Foo{
void SomeFunc();
void SomeOtherFunc(int);
}
在.cpp文件中,我想在命名空间中定义函数,同时也为它们都依赖的随机数生成器提供一些保护,使用匿名命名空间:
namespace Foo{
namespace{
RNG rando = new RNG();
}
void SomeFunc(){
//implementation
}
void SomeOtherFunc(){
//implementation
}
}
我遇到的问题是,不能保证头文件中的原型与我在cpp文件中定义的函数相匹配。命名空间{}代码块中的所有内容都可以只是添加到命名空间中的新内容。
在上面的代码示例中,SomeOtherFunc()是在没有int类型参数的情况下实现的,但是它的声明说它需要一些参数。实际上,我似乎重载了SomeOtherFunc()签名。
我可以在cpp文件中使用以下命令:
namespace Foo{
namespace{
RNG rando = new RNG();
}
}
void Foo::SomeFunc(){
//implementation
}
void Foo::SomeOtherFunc(int){
//implementation
}
编译器似乎强制函数的声明和实现之间的关系,我喜欢。但是,这些函数似乎无法访问匿名命名空间中的数据。
我错过了什么吗?我能做些什么来解决我觉得在这个实现中存在的问题吗?我不是很精通使用(匿名)名称空间,所以如果这看起来很基础,我很抱歉。
将未命名的命名空间移出另一个命名空间:
namespace{
RNG rando = new RNG();
}
void Foo::SomeFunc(){
//implementation
}
void Foo::SomeOtherFunc(int){
//implementation
}
无论如何都不能在翻译单元之外访问
据我所知,通常的约定是在.cpp文件的开头声明匿名命名空间。在您的示例中,您的cpp文件应该如下所示:
namespace{
RNG rando = new RNG();
}
void Foo::SomeFunc(){
//implementation
}
void Foo::SomeOtherFunc(int){
//implementation
}
匿名命名空间是一个转移注意力的东西。你可以忽略它,它实际上是一个实现细节。
是的,你可以在.cpp文件的头文件中重载一个函数。但是,如果您尝试使用pair中未定义的那一半,则会得到链接器错误。
相关文章:
- C++ gmock - 我们如何在单元测试 cpp 文件中读取/获取 cpp 文件函数的参数值
- 使用其他头文件函数的头文件
- 创建文件函数是否可以打开仅在WinObj实用程序中的全局目录下列出的设备的句柄?
- 如何指定创建文件函数获取未缓存的结果?
- 标准库头文件函数原型的实现是如何用 c++ 编写的?
- 如何将类对象作为对另一个头文件函数的引用传递
- 读取文件函数lpbuffer和字节以读取澄清
- C++ - 未定义的对多个文件函数的引用
- 使用C++的可视 Unicode 文件函数
- C 创建文件函数错误
- WinAPI 创建文件函数 2.
- 具有CREATE_ALWAYS处置的创建文件函数
- 重写c库文件函数
- 如何使用客户端调用堆栈中的地址从 PDB 检索文件/函数/行号?
- 通过头文件函数将遍历的数据从二进制搜索树加载到Vector中
- 需要帮助无法弄清楚为什么我的头文件函数声明不起作用
- 是否可以在不使用文件函数的情况下使用代码块从文件运行某些用例测试?
- 如何用c++文件函数读写8位整数单位形式的数据
- 在c++中读文件函数如何识别文本文件的结束
- 使用Windows API的c++文件函数