嵌套或非嵌套匿名命名空间,用于隐藏实现详细信息

Nested or non-nested anonymous namespace to hide implementation details

提问人:user2052436 提问时间:10/12/2023 最后编辑:user2052436 更新时间:10/12/2023 访问量:54

问:

嵌套匿名命名空间与将其置于翻译单元的顶层有什么区别?

namespace Named {
    namespace {
        void impl () {...}
   }

   void fun ()
   {
       impl();
   }
}

namespace {
    void impl () {...}
}

namespace Named {
    void fun ()
    {
        impl();
    }
 }
C++ 命名空间

评论

0赞 fabian 10/12/2023
替换为 或 第一个和第二个版本将分别仅适用于代码片段的第一个和第二个......问题中的两个代码片段应该具有相同的效果,但只要您的翻译单元中没有其他符号......impl();::Named::impl();::impl();impl
0赞 fabian 10/12/2023
当然,在这两种情况下,正文中的名称查找也存在差异。请注意,如果要向函数添加参数,ADL 也可能导致更改。(仅当参数的类型和函数在同一命名空间中重复时,ADL 才有效。impl

答:

0赞 Yksisarvinen 10/12/2023 #1

与所有命名空间相同 - 查找规则。在第一个示例中,如果已经有自己的,那将是一个错误。在第二种情况下,如果存在,它将被默默接管.在线查看Namedvoid impl(){}Named::implanonymous-namespace::impl

评论

0赞 user2052436 10/12/2023
我想我的问题是:在隐藏实现细节时,哪种方法更可取(只是风格方面或其他原因)?
0赞 Yksisarvinen 10/12/2023
@user2052436 无论如何,第一个版本对我来说似乎更好 - 如果定义重复,您会收到错误,它允许您在没有显式命名空间的情况下引用 in 中的使用名称,并且您可以为匿名命名空间中的类型添加运算符重载。NamedimplNamed