如何定义来自另一个命名空间(而不是全局命名空间)的函数和数据
How to define functions and data from another namespace, not in the global one?
就像我有一个带有一些声明的标题:
"标题.hpp"
extern int SomeData;
int SomeFunc();
以及它的实现(其中我声明了未命名命名空间中的所有函数和全局变量,以避免链接问题):
"标题.cpp"
#include "Header.hpp"
inline namespace
{
const int SomeLocalFileData = 9;
struct MyLocalStructure;
int SomeLocalFunction(MyLocalStructure *);
int ::SomeData(SomeLocalFileData);
int ::SomeFunc()
{
return SomeLocalFunction(nullptr);
}
}
上面的代码将失败并显示以下错误(使用"gcc"编译器):
错误:声明"SomeData"不在围绕"::"的命名空间中 int ::SomeData(SomeLocalFileData);
错误:声明"int SomeFunc()"不在周围的命名空间中 '::' int ::SomeFunc()
那么无论如何,我可以将所有本地文件符号声明为匿名命名空间,以避免链接问题,但同时能够定义我的函数和数据导出。
不允许在匿名命名空间中定义全局范围的对象。
如果要与其他编译单元共享SomeData
和SomeFunc()
,只需在命名空间之外定义它们即可。
匿名命名空间旨在避免您的符号在其编译单元之外共享。因此,如果您不想共享符号,请在匿名命名空间中定义它们。 在标头中声明它们将不会使它们可供其他编译单元使用。 如果将定义保留在仅包含在此文件中的标头中,则可以以相同的方式将定义括在匿名命名空间中。
我相信
您在Header.cpp
文件中要做的是:
inline namespace
{
const int SomeLocalFileData = 9;
struct MyLocalStructure;
int SomeLocalFunction(MyLocalStructure *);
}
int SomeData(SomeLocalFileData);
int SomeFunc()
{
return SomeLocalFunction(nullptr);
}
在同一个翻译单元中,在匿名命名空间之后,SomeData
和SomeFunc
的定义可以访问本地符号(例如 SomeLocalFileData
、 MyLocalStructure
和 SomeLocalFunction
) 在该匿名命名空间中定义。这些符号将对其他翻译单元保持隐藏状态。
相关文章:
- 在命名空间中使用全局命名空间中的函数
- 类与命名空间的全局实例
- 将好友从模板导出到全局命名空间
- Catalina C++:使用<cmath>标头产生错误:全局命名空间中没有名为 'signbit' 的成员
- 将以"_[a-z0-9]"开头和"using"的标识符导入全局命名空间是否定义良
- C++从 std::async 函数读取命名空间中的全局变量标志
- 为什么不允许在全局命名空间处阻止范围?
- 如何在命名空间中声明外部全局,然后定义它?
- 运算符<<依赖于参数的查找不在全局命名空间中查找
- 我可以停止 GCC 将标准库名称包含在全局命名空间中吗?
- 在C 中将全局函数包括在命名空间中
- 为什么在全局范围以及命名空间std中定义了size_t
- 如何处理警告 C4177:#pragma 'float_control' 只能在全局范围或命名空间范围内使用
- "uintmax_t":不是"全局命名空间"的成员
- C++项目中的全局命名空间
- 使用 "::member" 引用全局命名空间有什么用吗?
- 在全局命名空间中重载不依赖于用户定义类型的标准定义类型的运算符是否格式正确?
- 命名空间中的全局变量会导致"undefined reference to"
- 在C 中重新解析命名空间内的全局类型
- 命名空间全局变量丢失值 (C++)