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

     2023-02-23     152

关键词:

【中文标题】未命名的命名空间访问规则【英文标题】: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 的潜在范围是从它的声明点到翻译单元的结尾

【讨论】:

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

】为啥内联未命名的命名空间?【英文标题】:Whereforeinlineunnamednamespaces?为什么内联未命名的命名空间?【发布时间】:2013-12-1102:17:02【问题描述】:给专家的快速提示:C++11允许将未命名的命名空间声明为inline。这对我来说似... 查看详情

命名空间(代码片段)

 Python的命名空间是Python程序猿必须了解的内容,对Python命名空间的学习,将使我们在本质上掌握一些Python中的琐碎的规则。接下来我将分四部分揭示Python命名空间的本质:一、命名空间的定义;二、命名空间的查找顺序;三... 查看详情

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

】为啥要将类型放在未命名的命名空间中?【英文标题】:Whyshouldtypesbeputinunnamednamespaces?为什么要将类型放在未命名的命名空间中?【发布时间】:2015-11-1303:58:06【问题描述】:我了解使用未命名的命名空间使函数和变量具有内... 查看详情

C++ 中未命名命名空间的使用

】C++中未命名命名空间的使用【英文标题】:UsesofunnamednamespaceinC++【发布时间】:2011-07-1519:04:54【问题描述】:什么时候会在C++中使用未命名的命名空间?从某种意义上说,它比独立功能更好吗?另外,它应该只用在源文件中而... 查看详情

未命名的命名空间和 Visual C++ 链接器性能

】未命名的命名空间和VisualC++链接器性能【英文标题】:UnnamednamespacesandVisualC++linkerperformance【发布时间】:2014-04-0908:31:28【问题描述】:将代码放入未命名的命名空间是否会以任何方式提高链接器性能?理论上,当链接从不同... 查看详情

“模板规则匹配无命名空间中的元素”消息

】“模板规则匹配无命名空间中的元素”消息【英文标题】:"Templaterulesmatchelementsinnonamespace"message【发布时间】:2018-03-2906:05:57【问题描述】:我意识到命名空间问题是一毛钱,但我是从撒克逊人那里得到的:警告SXXP0005... 查看详情

XSLT 替换命名空间并添加新的(未使用的)命名空间

】XSLT替换命名空间并添加新的(未使用的)命名空间【英文标题】:XSLTtoreplaceanamespaceandalsoaddanew(unused)namespace【发布时间】:2021-05-1720:11:31【问题描述】:我想替换以下XML文档的命名空间<?xmlversion="1.0"encoding="UTF-8"?><ns0:Doc... 查看详情

什么时候适合在 C++ 中使用静态(通过未命名的命名空间)?

】什么时候适合在C++中使用静态(通过未命名的命名空间)?【英文标题】:Whenisitappropriatetousestatic(overunnamednamespaces)inC++?【发布时间】:2011-04-2222:09:25【问题描述】:我整天都在阅读有关未命名命名空间的文章,大多数文章都... 查看详情

为啥未命名的命名空间是静态的“优越”替代品? [复制]

】为啥未命名的命名空间是静态的“优越”替代品?[复制]【英文标题】:Whyanunnamednamespaceisa"superior"alternativetostatic?[duplicate]为什么未命名的命名空间是静态的“优越”替代品?[复制]【发布时间】:2011-06-2600:33:13【问题... 查看详情

FxCop 自定义规则检查命名空间

】FxCop自定义规则检查命名空间【英文标题】:FxCopcustomruletochecknamespace【发布时间】:2015-10-0814:47:25【问题描述】:我正在尝试在FxCop中编写自定义规则,以验证我的命名空间是否以特定单词开头。我尝试过类似以下的方法:publ... 查看详情

变量作用域(总结篇)(代码片段)

Python命名空间的本质Python的命名空间是Python程序猿必须了解的内容,对Python命名空间的学习,将使我们在本质上掌握一些Python中的琐碎的规则。接下来我将分四部分揭示Python命名空间的本质:一、命名空间的定义;二、命名空间... 查看详情

私有类函数与未命名命名空间中的函数

】私有类函数与未命名命名空间中的函数【英文标题】:PrivateclassfunctionsvsFunctionsinunnamednamespace【发布时间】:2011-03-2904:06:33【问题描述】:我发现自己往往没有私有类函数。如果可能的话,私有类函数的所有候选者,而不是我... 查看详情

2017-04-14命名空间访问修饰符封装继承多态

一、命名空间namespace命名空间名称如果命名空间一致,才能在他下面访问那些不同的类,如果不一致是没有办法直接访问的。不同命名空间下都是public访问修饰符,想要调用,得在using处引用命名空间using....是引用的命名空间二... 查看详情

Helm RBAC 规则在这些创建的名称中创建命名空间和资源

】HelmRBAC规则在这些创建的名称中创建命名空间和资源【英文标题】:HelmRBACrulestocreatenamespacesandresourcesinsidethosecreatedname【发布时间】:2020-06-2722:18:16【问题描述】:我发现了很多关于如何授予helm权限以在特定命名空间中创建资... 查看详情

c++primer5th笔记(chap18大型程序工具)未命名的命名空间unnamednamespace(代码片段)

...espace后紧跟花括号括起来的一系列声明语句1.1生命周期未命名的命名空间中定义的变量拥有静态生命周期:它们在第一次使用前创建,并且直到程序结束才销毁未命名的命名空间取代文件中的static静态声明1.2多个文件每... 查看详情

legb规则

链接:https://www.cnblogs.com/GuoYaxiang/p/6405814.html命名空间大约来说,命名空间就是一个容器,其中包含的是映射到不同对象的名称。你可能已经听说过了,Python中的一切——常量,列表,字典,函数,类,等等——都是... 查看详情

类的命名规则

类定义的命名规则,是命名空间(应用程序名称)指向应用程序的app文件夹,而类名除了命名空间和类名中最后部分之外,其他的都是文件夹的名称。类名的最后部分加上.js就是类的文件名,如Ext.define("Ledger.controller.Main"),Ledg... 查看详情

Laravel 5.1 中未定义的默认命名空间

】Laravel5.1中未定义的默认命名空间【英文标题】:UndefineddefaultnamespacesinLaravel5.1【发布时间】:2016-05-1221:00:04【问题描述】:我正在用Laravel5.1开发一个应用程序。并且由于某种原因,有大量默认命名空间路径是红色的(使用PHPSt... 查看详情