两个未命名的命名空间,在同一声明区域中定义

时间:2014-06-25 13:25:06

标签: c++ namespaces unnamed-namespace

请考虑以下代码:

#include<iostream>

namespace
{
    int a = 5;
}

namespace
{
    int a = 5;
}
int main()
{ 
    int i=5;
    {
        std::cout << i;
    }
}

此代码无效。这是因为发生了a的重新定义。但我希望这是有效的。实际上,秒。 3.3.6 / 1说:

  

[...] 原始命名空间名称表示的潜在范围是   每个人建立的声明区域的连接   与之相同的声明性区域中的名称空间定义   的原始名称空间名称即可。[...]

但未命名的命名空间定义不是原始命名空间定义和秒。 7.3.1 / 1说:

namespace-name:
    original-namespace-name
    namespace-alias
original-namespace-name:
    identifier

original-namespace-definition:
    inline_opt namespace identifier { namespace-body }

而且,秒。 7.3.1.1说:

  

unnamed-namespace-definition的行为就像它被

替换一样
inlineopt namespace unique { /* empty body */ }
using namespace unique ;
namespace unique { namespace-body }
     

当且仅当内联出现在内容中时,内联出现   unnamed-namespace-definition,a中所有出现的唯一   翻译单元由相同的标识符替换,并且这个   标识符与整个程序中的所有其他标识符不同

这意味着两个未命名的命名空间具有不同的 唯一

你能解释我引用的代码中的行为吗?

1 个答案:

答案 0 :(得分:8)

你引用的那篇:

  

翻译单元中出现的所有唯一都将替换为相同的标识符

因此,翻译单元中的所有未命名的命名空间都是相同的。