在C ++中,用某种前缀命名成员变量以表示它们是成员变量而不是局部变量或参数是很常见的。如果你来自MFC背景,你可能会使用m_foo
。我偶尔也见过myFoo
。
C#(或者可能只是.NET)似乎建议只使用下划线,如_foo
中所示。这是否允许C ++标准?
答案 0 :(得分:798)
答案 1 :(得分:186)
避免名称冲突的规则都在C ++标准中(参见Stroustrup一书),并由C ++大师(Sutter等)提及。
因为我不想处理案件,并且想要一个简单的规则,所以我设计了一个既简单又正确的个人:
命名符号时,如果您:
,将避免与编译器/ OS /标准库发生冲突当然,将代码放在一个唯一的命名空间中也有助于避免冲突(但不能防止恶意宏)
(我使用宏是因为它们对C / C ++符号的代码污染更多,但它可以是从变量名到类名的任何东西)
#define _WRONG
#define __WRONG_AGAIN
#define RIGHT_
#define WRONG__WRONG
#define RIGHT_RIGHT
#define RIGHT_x_RIGHT
从n3242.pdf文件(我希望最终的标准文本类似):
17.6.3.3.2全局名称[global.names]
某些名称和功能签名集始终保留给实现:
- 包含双下划线_ _或以下划线后跟大写字母(2.12)开头的每个名称都保留给实现以供任何使用。
- 以下划线开头的每个名称都保留给实现,以用作全局命名空间中的名称。
但是:
17.6.3.3.5用户定义的文字后缀[usrlit.suffix]
不以下划线开头的文字后缀标识符保留用于将来的标准化。
这最后一个条款令人困惑,除非您认为如果在全局命名空间中定义了 not ,则以一个下划线开头并后跟一个小写字母的名称将为Ok ...
答案 2 :(得分:35)
来自MSDN:
在标识符的开头使用两个连续的下划线字符(__),或者在大写字母中为C ++实现保留单个前导下划线后跟大写字母。对于具有文件范围的名称,应避免使用一个前导下划线后跟小写字母,因为可能与当前或将来的保留标识符冲突。
这意味着您可以使用单个下划线作为成员变量前缀,只要它后面跟一个小写字母。
这显然取自C ++标准的第17.4.3.1.2节,但我无法在线找到完整标准的原始来源。
答案 3 :(得分:23)
至于问题的其他部分,通常将下划线放在变量名的 end 处,以免与内部任何内容发生冲突。
我甚至在类和名称空间内执行此操作,因为我只需要记住一条规则(与“在全局范围内名称的末尾,以及其他地方名称的开头”相比)。
答案 4 :(得分:3)
是的,下划线可用于标识符中的任何位置。我相信规则是:第一个字符中的任何a-z,A-Z,_和后续字符的+ 0-9。
下划线前缀在C代码中很常见 - 单个下划线表示“私有”,双下划线通常保留供编译器使用。