在C ++中通常用某种前缀命名成员变量来表示它们是成员变量而不是局部变量或参数。如果你来自MFC背景,你可能会使用m_foo。我myFoo偶尔也见过。C#(或者可能只是.NET)似乎建议只使用下划线,如_foo。这是否允许C ++标准?
4 回答
繁花如伊
TA贡献2012条经验 获得超12个赞
避免名称冲突的规则都是C ++标准(参见Stroustrup书)和C ++大师(Sutter等)提到的。
个人规则
因为我不想处理案件,并且想要一个简单的规则,所以我设计了一个简单而正确的个人案例:
命名符号时,如果您符合以下条件,则可避免与编译器/ OS /标准库冲突:
永远不要用下划线开始一个符号
永远不要在里面用两个连续的下划线命名。
当然,将代码放在一个唯一的命名空间中也有助于避免冲突(但不能防止恶意宏)
一些例子
(我使用宏,因为它们是C / C ++符号的代码污染更多,但它可以是从变量名到类名的任何东西)
#define _WRONG#define __WRONG_AGAIN#define RIGHT_#define WRONG__WRONG#define RIGHT_RIGHT#define RIGHT_x_RIGHT
来自C ++ 0x草案的摘录
从n3242.pdf文件(我希望最终的标准文本类似):
17.6.3.3.2全局名称[global.names]
某些名称和函数签名集始终保留给实现:
- 包含双下划线_ _或以下划线后跟大写字母(2.12)开头的每个名称都保留给实现以供任何使用。
- 以下划线开头的每个名称都保留给实现,以用作全局名称空间中的名称。
但是也:
17.6.3.3.5用户定义的文字后缀[usrlit.suffix]
不以下划线开头的文字后缀标识符保留用于将来的标准化。
最后一个条款令人困惑,除非您认为如果未在全局命名空间中定义,以一个下划线开头并后跟一个小写字母的名称将为Ok ...
Smart猫小萌
TA贡献1911条经验 获得超7个赞
至于问题的另一部分,通常将下划线放在变量名的末尾,以免与内部任何内容发生冲突。
我甚至在类和名称空间内执行此操作,因为我只需要记住一条规则(与“在全局范围内的名称末尾,以及其他地方名称的开头”相比)。
- 4 回答
- 0 关注
- 1174 浏览
添加回答
举报
0/150
提交
取消