全局作用域中匿名命名空间中的Can名称具有前导下划线
Can names inside an anonymous namespace in the global scope have leading underscores?
根据规范,不允许使用前导下划线的全局名称:
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++标识符中使用下划线的规则是什么?
相关文章:
- 未在作用域中声明unordered_map
- 有没有一种方法可以在编译时获得作用域类名
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- C++quit()函数中可能存在作用域问题
- 未在此作用域OpenCV3.4中声明cvSaveImage
- 全局作用域中函数指针的赋值
- 在类函数中初始化外部作用域变量
- 不同作用域中的静态变量和全局变量
- 是同一作用域的函数部分中的函数调用
- 未在此作用域中声明的函数和变量 (C++)
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 将作用域枚举转换为基础类型
- 表达式必须具有完整或无作用域的枚举图
- 在构造函数中输入对象时C++类成员作用域
- 在没有显式作用域的情况下无法访问模板基类的静态成员
- rand_r不在作用域中,gcc-mingw在windows上的cygwin下
- 全局作用域中匿名命名空间中的Can名称具有前导下划线
- 为什么可以在没有初始化项的情况下跳转到标量类型对象的作用域?
- 是否有可能在不使用指针的情况下将变量的作用域扩展到if语句之外?
- 为什么我们应该把' std::unique_lock '放在本地作用域下