命名空间内的局部函数声明
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 - 这个答案比我的更完整。离开我的,因为它仍然有那个有用的例子。以上是关于命名空间内的局部函数声明的主要内容,如果未能解决你的问题,请参考以下文章