【问题标题】: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

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

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

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

【问题讨论】:

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

标签: c++ function namespaces private


【解决方案1】:

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

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

namespace {
    void func();
}

…

namespace {
    void func()
    {
        …
    }
}

【讨论】:

    猜你喜欢
    • 2011-10-31
    • 2019-10-29
    • 2017-05-31
    • 2018-10-28
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 2011-06-30
    • 2019-09-27
    相关资源
    最近更新 更多