根据规范,不允许使用带有前导下划线的全局名称:
17.4.3.1.2全局名称
- 以下划线开头的每个名称都保留给实现,以用作全局名称空间中的名称.
这是否也适用于顶级匿名命名空间中定义的名称?
以前导下划线开头,后跟非大写字母数字字符且不包括双下划线的名称仅保留在全局命名空间中.这样做的原因是,在某些系统上,某些名称需要获得前导下划线或已被底层操作系统和/或其C库使用.匿名命名空间中的名称没有此问题.
也就是说,我总是想知道为什么人们如此热衷于使用丑陋的名字!除非我处于标准库实现模式(我实际上必须使用丑陋的名称,以免与用户名冲突),我总是想知道我是否在我的代码中使用前导下划线做错了!在极少数情况下需要使用前导下划线(例如,在调用_exit()或使用std::bind()占位符时),但通常用户不应触摸它们:既不使用也不定义它们.
是的。但这句话并没有解决这个问题(正如您自己所知)。
我认为适用于此的内容如下:
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)
一个更笼统的话题: