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

Posted

技术标签:

【中文标题】C++:在匿名命名空间中声明函数原型的正确方法是啥?【英文标题】:C++: what is the proper way of declaring function prototype in anonymous namespace?C++:在匿名命名空间中声明函数原型的正确方法是什么? 【发布时间】:2015-09-01 04:44:25 【问题描述】:

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

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

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

'&lt;type&gt; &lt;named_namespace&gt;::anonymous::&lt;function&gt;(&lt;parameters&gt;)' should have been declared inside &lt;named_namespace&gt;

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

'&lt;type&gt; &lt;named_namespace&gt;::&lt;function&gt;(&lt;parameters&gt;)' declared 'static' but never defined

据我了解,只能通过将功能保存在单个文件(头文件或源文件)中来禁用它。

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

或者也许将头文件分成“公共”和“私有”部分更有效?

【问题讨论】:

如果这个函数是私有的,为什么要把它放在头文件中? 为什么要在匿名命名空间中声明?正如编译器所说,它不应该是。你想完成什么? 未命名命名空间的目的是避免其他翻译单元的可见性,因此声明它是无稽之谈。看到这个问题:***.com/questions/357404/… 这看起来像xy problem,你想做什么?将匿名命名空间放在头文件中几乎没有意义。对于静态函数也是如此。如果它只是定义并且只能从一个文件中使用,为什么要在多个文件中声明它? 好吧,我在 C++ 中缺乏静态类功能,所以我尝试通过命名空间来实现它。现在我发现这是不可能的。 【参考方案1】:

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

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

namespace 
    void func();


…

namespace 
    void func()
    
        …
    

【讨论】:

以上是关于C++:在匿名命名空间中声明函数原型的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

模块与命名空间:组织大型打字稿项目的正确方法是啥?

通过匿名类声明新线程的最佳方法是啥?

C++问题:关于匿名命名空间

C++ 中命名空间别名的范围是啥?

C++学习_C++概述

私有静态成员函数或匿名命名空间中的自由函数?