全局范围内的匿名命名空间内的名称是否具有前导下划线?

时间:2012-01-01 05:49:48

标签: c++

根据规范,不允许使用带有前导下划线的全局名称:

  

17.4.3.1.2全球名称
   - 以下划线开头的每个名称都保留给实现,以用作全局名称空间中的名称。

这是否也适用于顶级匿名命名空间中定义的名称?

2 个答案:

答案 0 :(得分:6)

以前导下划线开头,后跟非大写字母数字字符且不包含双下划线的名称仅保留在全局命名空间中。这样做的原因是,在某些系统上,某些名称需要获得前导下划线或已被底层操作系统和/或其C库使用。匿名命名空间中的名称没有此问题。

那就是说,我总是想知道为什么人们如此热衷于使用丑陋的名字!除非我处于标准库实现模式(我实际上必须使用丑陋的名称,以免与用户名冲突),我总是想知道我是否在我的代码中使用前导下划线做错了!极少数情况下需要使用前导下划线(例如,在调用_exit()或使用std::bind()的占位符时)但通常用户不应触摸它们:既不使用也不定义它们。

答案 1 :(得分:3)

是。但是这句话并没有解决这个问题(正如你自己所知)。

以下是我认为适用的内容:

  

17.4.3.1.3外部链接

     

3。每个具有两个连续下划线(2.11)的名称保留给实现,以用作具有extern“C”和extern“C ++”链接的名称。

我认为它适用于在匿名命名空间中使用外部链接声明的变量,但应该注意它会讨论 double 下划线。所以:

namespace
{
   std::string __s1; //not allowed
   std::string _s2;  //allowed (allowed, as I understand)
}

更一般的主题: