如何定义来自另一个命名空间(而不是全局命名空间)的函数和数据

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

本文关键字:命名空间 全局 函数 数据 另一个 何定义 定义      更新时间:2023-10-16

就像我有一个带有一些声明的标题:

"标题.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()

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

不允许在匿名命名空间中定义全局范围的对象。

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

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

我相信

您在Header.cpp文件中要做的是:

inline namespace
{
  const int SomeLocalFileData = 9;
  struct MyLocalStructure;
  int SomeLocalFunction(MyLocalStructure *);
}
int SomeData(SomeLocalFileData);
int SomeFunc()
{
    return SomeLocalFunction(nullptr);
}

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