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

Sta*_*ked 8 c++

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

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

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

Die*_*ühl 6

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

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

  • 我完全同意这里表达的观点.来自我的`+ 1`,我碰巧知道问题出自[C++聊天室](http://chat.stackoverflow.com/rooms/10/loungec)的讨论,而不是因为Stacked意味着使用那些名字,但由于这些问题可能被成千上万的其他用户看到,我发现至少要提到这一点很重要. (2认同)

Naw*_*waz 3

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

我认为适用于此的内容如下:

17.4.3.1.3 外部链接

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

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

namespace
{
   std::string __s1; //not allowed
   std::string _s2;  //allowed (allowed, as I understand)
}
Run Code Online (Sandbox Code Playgroud)

一个更笼统的话题:

  • 不,当它说“任何用途”时,它确实是这个意思。查看标准库的头文件,尤其是定义类和函数模板的头文件。您会发现大多数用户代码无法使用的名称(例如,包括保护、其他宏、模板参数名称、变量名称等)的形式都是“__x”或“_X”。这是因为这些名称被保留给实现_以供任何使用_。如果这些名称没有被保留_用于任何用途_,那么用户代码可以将这些名称定义为宏,并且标准库根本无法工作。 (2认同)