C++:在匿名命名空间中声明函数原型的正确方式是什么?

3
如果我以明显的方式在.h中声明它:
namespace <named_namespace> {
    namespace {
        …
        <type> <function>(<parameters>);
        …
    }
}

如果将其实现放在 .cpp 中,会出现编译错误:

'<type> <named_namespace>::{anonymous}::<function>(<parameters>)' 应该在<named_namespace>内部声明

有没有可能避免在单个文件中放置函数实现而不出现此错误?目前我使用关键字static代替,但它会产生多个烦人的警告:

'<type> <named_namespace>::<function>(<parameters>)' 被声明为 'static',但未定义

据我了解,这些警告只能通过将函数保留在单个文件(头文件或源文件)中来禁用。

跨编译器的解决方法是可以接受的(如果有的话)。

或者将头文件分成“公共”和“私有”两个部分是否更有效?


1
为什么将这个函数放在头文件中,如果它是私有的 - Jarod42
为什么要在匿名命名空间中声明?正如编译器所说,这是不应该的。你想要实现什么目标? - molbdnilo
1
未命名命名空间的目的是避免其他翻译单元的可见性,因此声明它是没有意义的。 请参阅此SO问题:https://dev59.com/RXRC5IYBdhLWcg3wROtQ - Nielk
这看起来像是一个xy问题,你想要做什么?将匿名命名空间放在头文件中几乎从来没有意义。静态函数也是如此。如果它只在一个文件中定义和使用,为什么要在多个文件中声明它呢? - Jonathan Wakely
我在C++中缺乏静态类功能,因此我尝试通过命名空间来实现它。现在我发现这是不可能的。 - Vercetti
1个回答

6

你不能跨翻译单元使用匿名命名空间,因此将匿名命名空间放在 .h 中不会按预期工作。在每个翻译单元 (.cpp) 中,该命名空间被分配了一个不同的唯一名称。

分离声明和定义是可能的,但只能在该命名空间内部进行:

namespace {
    void func();
}

…

namespace {
    void func()
    {
        …
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接