全局作用域中匿名命名空间中的Can名称具有前导下划线

Can names inside an anonymous namespace in the global scope have leading underscores?

本文关键字:下划线 作用域 命名空间 全局 Can      更新时间:2023-10-16

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

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)
}

更一般的主题:

  • 在c++标识符中使用下划线的规则是什么?