未命名的命名空间访问规则

Posted

技术标签:

【中文标题】未命名的命名空间访问规则【英文标题】:Unnamed namespace access rules 【发布时间】:2012-03-26 05:51:05 【问题描述】:

我正在查看 C++03 标准中的 7.3.1.1 部分,希望找到对未命名命名空间中定义的项目的访问规则的一些描述。

对于未命名的命名空间,规则似乎有些不同,因为您不能完全限定对项目的访问。我知道至少在同一个翻译单元中,人们可以访问未命名命名空间中的项目,就好像它们不在命名空间中一样。例如:

namespace 
  int foo;


void something()

  foo = 4;

如果命名空间有名字,你就不能这样做。那么,标准中为这些适用于未命名命名空间的异常规则定义的规则在哪里?

【问题讨论】:

匿名命名空间只表示它只能在同一个翻译单元中看到。所有其他命名空间规则都应适用。您可以将东西放在另一个名称空间中,也可以放在另一个名称空间中。以namespace bar namespace int r; 为例。 【参考方案1】:

匿名命名空间基本上被视为:

namespace unique_per_TU

    // Stuff

using namespace unique_per_TU;

我稍后会尝试在此处找到参考。

编辑:

您似乎已经在7.3.1.1/1找到它

一个未命名的命名空间定义的行为就像它被替换了一样

namespace unique  /* empty body */ 
using namespace unique;
namespace unique  namespacebody 

所有出现的唯一性 翻译单元被相同的标识符替换,这 标识符不同于整个程序中的所有其他标识符。

“假” using 已经将命名空间成员带入了您发现的全局命名空间。

【讨论】:

完美;这是就在我的鼻子底下,甚至没有看到它。我以为这是在将定义与命名空间进行比较,所以我有点困惑。 每个文件的唯一性并不完全正确。每个翻译单元都是唯一的。【参考方案2】:

除了在 7.3.1.1/1 中定义未命名命名空间的标准引用外, 这在

中的示例之一中明确说明

3.3.5/1 命名空间范围:

namespace-definition 的声明区域是它的namespace-bodyoriginal-namespace-name 表示的潜在范围是由每个 namespace-definitions 与该 在同一声明区域中建立的声明区域的串联原始命名空间名称namespace-body 中声明的实体被称为命名空间的成员,这些声明引入到命名空间的声明区域的名称被称为命名空间的成员名称。命名空间成员名称具有命名空间范围。它的潜在范围包括从名称的声明点(3.3.1)开始的名称空间;对于每个指定成员命名空间的 using-directive (7.3.4), 成员的潜在范围包括在成员声明点之后的using-directive的潜在范围部分。

>[Example:
namespace N 
      int i;
      int g(int a)  return a; 
      int j();
      void q();

namespace  int l=1; 
// the potential scope of l is from its point of declaration
// to the end of the translation unit

namespace N 
    int g(char a) // overloadsN::g(int)
    
        return l+a; // l is from unnamed namespace
    
    int i; // error: duplicate definition
    int j(); // OK: duplicate function declaration
    int j() // OK: definition ofN::j()
    
       return g(i); // callsN::g(int)
    
    int q(); // error: different return type

——结束示例]

注意措辞:l 的潜在范围是从它的声明点到翻译单元的结尾

【讨论】:

以上是关于未命名的命名空间访问规则的主要内容,如果未能解决你的问题,请参考以下文章

命名空间

python命名空间的本质

为啥内联未命名的命名空间?

为啥要将类型放在未命名的命名空间中?

变量作用域(总结篇)

Python 命名空间与LEGB规则