全局命名空间中的保留名称

rer*_*run 5 c++ token-name-resolution

由我对C++中动态对象数组的回答以及后续有关在C++标识符中使用下划线的规则有哪些?:显然,_在全局命名空间中保留以大写字母开头的名称.

17.4.3.2.1全局名称[ lib.global.names]

某些名称和函数签名集始终保留给实现:

  • 每个包含双下划线(__)或以下划线后跟大写字母(2.11)开头的名称都保留给实现以供任何使用.
  • 以下划线开头的每个名称都保留给实现,以用作全局名称空间中的名称.165

165)这些名称也在名称空间中保留::std(17.4.3.1).

在我对第一个问题的回答中,我有一个看起来像这样的课程

class A
{
 private:
   vector<int> _Ints;
}
Run Code Online (Sandbox Code Playgroud)

在评论中,我被告知_Ints标识符调用未定义的行为,因为它是一个保留名称.但是,根据最近的标准草案,使用以下规则进行成员变量的名称查找:

3.4.3.1班级成员[ class.qual]

如果嵌套namespeci网络ER A的合格音响ED-ID提名的一类,后指定的名称嵌套namespeci网络ER在类(10.2)的范围抬头,除下列情况下.该名称应代表该类或其基类之一的一个或多个成员

对我来说,这意味着没有成员变量可以成为全局命名空间的一部分,因为它的范围是类.

而现在,问题是:

我的理解是否正确,成员变量永远不会违反实现保留名称规则,因为它们不在全局命名空间中?如果我不正确,有人可以解释我对查询规则的误解吗?

Jam*_*nze 6

_Int显然违反了第一条规则:"每个包含双下划线(_ _)的名称或以下划线后跟大写字母(2.11)的名称保留给实现用于任何用途.""任何使用"都意味着它所说的:它可能是预定义的宏,或触发编译器中的某些特殊行为,或编译器作者想要的任何其他内容.使用名称无关紧要,如果使用它,则是未定义的行为(除非编译器文档另有说明).

更一般地说,至少在历史上,编译器相当松散,并且许多系统头文件传统上包括名称以单个下划线开头,后跟小写字母的宏.它也可能是最好的避免这些.(历史上,甚至,已经有名字没有下划线为好.我知道,我已经受够了名字的问题linux变得1没有凸显在眼前,但是...,没有太多可以做这一点,但是除了改变冲突发生时的名称.)

更一般地说,下划线在某些字体中并没有表现得那么好,并且最好在符号的任何一端避开它们.

  • “下划线在某些字体中的显示效果不佳” - 1、l 和 I 在某些字体中看起来相似,因此要避免在标识符中使用下划线吗?或者在阅读代码时避免使用这些字体? (2认同)
  • @SteveJessop让符号不同只是因为一个使用小写字母l而另一个使用数字1不是一个好主意.对于下划线,它们分隔单词(其中它们类似于空格的事实并不是太大的问题),但区分`_name`,`name_`和`name`几乎不比使用`x1`,` xl`或`xO`和`x0`. (2认同)