如何从另一个名称空间定义函数和数据,而不是全局名称空间?

就像我有一个包含一些声明的头部一样:

“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()

因此,无论如何,我可以将所有本地文件符号声明为匿名命名空间,以避免链接问题,但同时可以定义我的函数和数据导出。


您不能在匿名命名空间中定义全局作用域的对象。

如果您想与其他编译单元共享SomeDataSomeFunc() ,您只需在名称空间外定义它们即可。

匿名命名空间是为了避免您的符号在其编译单元之外共享。 因此,如果您不想共享这些符号,请在匿名命名空间中定义它们。 在头文件中声明它们将不会使它们可用于其他编译单元。 如果您希望将定义保留在仅包含在此文件中的标头中,则可以用相同的方式将定义放在匿名名称空间中。


我相信你在你的Header.cpp文件中要做的是:

inline namespace
{
  const int SomeLocalFileData = 9;

  struct MyLocalStructure;

  int SomeLocalFunction(MyLocalStructure *);
}

int SomeData(SomeLocalFileData);

int SomeFunc()
{
    return SomeLocalFunction(nullptr);
}

在相同的翻译单元中,在匿名命名空间之后, SomeDataSomeFunc的定义可以访问在该匿名命名空间中定义的本地符号(例如SomeLocalFileDataMyLocalStructureSomeLocalFunction )。 这些符号将对其他翻译单元保持隐藏。

链接地址: http://www.djcxy.com/p/35327.html

上一篇: How to define functions and data from another namespace, not in the global one?

下一篇: How anonymous namespaces avoids making global static variable?