从我的回答中得出C++ 中的动态对象数组并作为后续行动在 C++ 标识符中使用下划线的规则是什么?:
显然,名字开头_
后面跟着的大写字母在全局命名空间中保留。
17.4.3.2.1 全局名称[lib.global.names
]
某些名称和函数签名集始终保留给实现:
- 每个包含双下划线的名称 (
__
)或以下划线开头,后跟大写字母(2.11)保留给实现以供任何使用。
- Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace.165
165) Such names are also reserved in namespace ::std
(17.4.3.1).
在我对第一个问题的回答中,我有一堂课看起来像这样
class A
{
private:
vector<int> _Ints;
}
在评论中我被告知_Ints
标识符调用未定义的行为,因为它是保留名称。然而,根据该标准的最新草案,成员变量的名称查找使用以下规则:
3.4.3.1 类成员[class.qual
]
If the 嵌套名称说明符 of a 合格ID提名一个类,名称后面指定嵌套名称说明符在类(10.2)的范围内查找,除了下面列出的情况。名称应
代表该类或其基类之一的一个或多个成员
对我来说,这意味着任何成员变量都不能成为全局命名空间的一部分,因为它的作用域是类。
现在,问题是:
我的理解是否正确,成员变量永远不会违反实现保留名称规则,因为它们不在全局命名空间中?如果我不正确,有人可以解释我对查找规则的误解吗?
_Int
显然违反了第一条规则:“每个包含
双下划线 (_ _) 或以下划线开头,后跟
大写字母(2.11)保留给任何实施
使用。” “任何用途”的意思正是它所说的:它可以
是一个预定义的宏,或者在编译器中触发一些特殊行为,
或编译器作者想要的任何其他内容。你在哪里并不重要
使用名称,如果使用它,它是未定义的行为(除非
编译器文档另有说明)。
更一般地说,至少从历史上看,编译器相当宽松,
许多系统头文件传统上都包含宏
以一个下划线开头,后跟一个小写字母的名称。
最好也避免这些。 (甚至历史上,有
也有不带下划线的名称。我知道我遇到了问题
与名字linux
变得1
。看不到下划线,但是......
但是,除了更改名称之外,您对此无能为力
当冲突发生时。)
更一般地说,下划线在某些字体中显示得不太好,
最好避免在符号的两端使用它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)