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

标签 c++ function namespaces private

如果我以明显的方式在 .h 中声明它:

namespace <named_namespace> {
    namespace {
        …
        <type> <function>(<parameters>);
        …
    }
}

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

'<type> <named_namespace>::{anonymous}::<function>(<parameters>)' should have been declared inside <named_namespace>

是否可以在不将函数的实现放在单个文件中的情况下避免此错误?目前我使用关键字 static相反,它会产生多个烦人的警告:

'<type> <named_namespace>::<function>(<parameters>)' declared 'static' but never defined

据我所知,只能通过将功能保留在单个文件( header 或源文件)中来禁用它。

欢迎使用交叉编译器解决方案(如果有的话)。

或者将头文件拆分为“公共(public)”部分和“私有(private)”部分可能更有效?

最佳答案

您不能拥有跨翻译单元工作的匿名命名空间,因此将匿名命名空间放在 .h 中将不会像您预期的那样工作。在每个翻译单元 (.cpp) 中,该命名空间都分配了一个不同的唯一名称。

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

namespace {
    void func();
}

…

namespace {
    void func()
    {
        …
    }
}

关于C++:在匿名命名空间中声明函数原型(prototype)的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30866325/

相关文章:

c++ - 如何确保模板类型是数字类型?

c++ - 为什么我不能在这个类中设置一个值?

c++ - 混合来自不同编译器的 C++ 代码

c++ - 如何不继承 C++ 类中的变量

c - 编写一个将 "12#abcd#09bla"转换为 "abcd"的函数

visual-studio-2010 - 为什么命名空间在 Visual Studio 2010 中起作用?

c - 何时在 C 中使用类函数宏

c - C 中的函数是否有 "type name"?

c# - 显式和隐式 XML namespace

javascript - 将变量加载到异步 JS 中?