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中,会出现编译错误:
'<type> <named_namespace>::anonymous::<function>(<parameters>)' should have been declared inside <named_namespace>
如果不将函数的实现放在单个文件中,是否可以避免此错误?目前我使用关键字static
代替,但它会产生多个烦人的警告:
'<type> <named_namespace>::<function>(<parameters>)' declared 'static' but never defined
据我了解,只能通过将功能保存在单个文件(头文件或源文件)中来禁用它。
欢迎使用交叉编译器解决方案(如果有)。
或者也许将头文件分成“公共”和“私有”部分更有效?
【问题讨论】:
如果这个函数是私有的,为什么要把它放在头文件中? 为什么要在匿名命名空间中声明?正如编译器所说,它不应该是。你想完成什么? 未命名命名空间的目的是避免其他翻译单元的可见性,因此声明它是无稽之谈。看到这个问题:***.com/questions/357404/… 这看起来像xy problem,你想做什么?将匿名命名空间放在头文件中几乎没有意义。对于静态函数也是如此。如果它只是定义并且只能从一个文件中使用,为什么要在多个文件中声明它? 好吧,我在 C++ 中缺乏静态类功能,所以我尝试通过命名空间来实现它。现在我发现这是不可能的。 【参考方案1】:您不能拥有跨翻译单元工作的匿名命名空间,因此将匿名命名空间放在 .h
中不会像您预期的那样工作。在每个翻译单元 (.cpp
) 中,该命名空间被分配了一个不同的唯一名称。
单独的声明和定义是可能的,但只能在该命名空间内:
namespace
void func();
…
namespace
void func()
…
【讨论】:
以上是关于C++:在匿名命名空间中声明函数原型的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章