命名空间内的局部函数声明

Posted

技术标签:

【中文标题】命名空间内的局部函数声明【英文标题】:Local function declaration inside namespace 【发布时间】:2012-12-18 04:07:48 【问题描述】:

在这种情况下

namespace n 
    void f() 
        void another_function();
    

函数another_function应该定义在命名空间n内部还是外部? VS 2012(带有November CTP)说它应该在外面,而Mac上的GCC 4.7.2说它应该在里面。如果我做错了,我会从链接器中得到未定义的符号错误。

我通常相信 GCC 更符合标准,但这是 C++,你永远无法确定。

【问题讨论】:

你为什么要这么做? @BillyONeal 因为another_function 是一个实现细节,f 是一个模板。 但是在f 中声明another_function 并不比f 更不可见。如果有人碰巧定义了自己的n::another_function,它只会导致多个定义错误。 @BillyONeal 没有客户会/不应该将东西放入我的命名空间,因为它是一个库。它确实使它稍微不那么明显,因为他们必须努力获得原型。有没有更好的方法? 我只是将原型放在your_namespace::detail 中。无论如何,这就是 boost 在这些情况下所做的。约定是命名空间detail 内的任何内容都是实现细节。 【参考方案1】:

根据 N3485 7.3.1 [namespace.def]/6,正确答案是n::another_function

声明的封闭命名空间是那些命名空间 声明在词汇上出现,除了重新声明 其原始名称空间之外的名称空间成员(例如,定义 如 7.3.1.2 所述)。这样的重新声明具有相同的封闭 命名空间作为原始声明。 [ 例子:

namespace Q 
    namespace V 
        void f(); // enclosing namespaces are the global namespace, Q, and Q::V
        class C  void m(); ;
    
    void V::f()  // enclosing namespaces are the global namespace, Q, and Q::V
        extern void h(); // ... so this declares Q::V::h
    
    void V::C::m()  // enclosing namespaces are the global namespace, Q, and Q::V
    

——结束示例]

【讨论】:

【参考方案2】:

C++11 3.5(以及 C++03)

7 未找到具有链接的实体的块范围声明时 要引用其他声明,则该实体是 最里面的封闭命名空间。然而这样的声明并不 在其命名空间范围内引入成员名称。

您示例中的声明声明了n::another_function

【讨论】:

+1 - 这个答案比我的更完整。离开我的,因为它仍然有那个有用的例子。

以上是关于命名空间内的局部函数声明的主要内容,如果未能解决你的问题,请参考以下文章

python 函数进阶

函数的 命名空间 作用域

命名空间

python函数名称空间

python globals()和locals(),global和nonlocal,以及闭包

10函数进阶---命名空间