为了账号安全,请及时绑定邮箱和手机立即绑定

在C ++标识符中使用下划线有哪些规则?

在C ++标识符中使用下划线有哪些规则?

杨魅力 2019-05-20 16:44:36
在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 ...


查看完整回答
反对 回复 2019-05-20
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

至于问题的另一部分,通常将下划线放在变量名的末尾,以免与内部任何内容发生冲突。

我甚至在类和名称空间内执行此操作,因为我只需要记住一条规则(与“在全局范围内的名称末尾,以及其他地方名称的开头”相比)。


查看完整回答
反对 回复 2019-05-20
  • 4 回答
  • 0 关注
  • 1174 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信