如何从另一个名称空间定义函数和数据,而不是全局名称空间?
就像我有一个包含一些声明的头部一样:
“Header.hpp”
extern int SomeData;
int SomeFunc();
和它的一个实现(我在其中声明所有的函数和全局变量在一个未命名的名字空间,以避免连接问题):
“Header.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
)。 这些符号将对其他翻译单元保持隐藏。
上一篇: How to define functions and data from another namespace, not in the global one?
下一篇: How anonymous namespaces avoids making global static variable?