在C ++中跟踪成员变量的下划线

时间:2010-09-06 10:13:41

标签: c++ naming-conventions member

我见过人们在类中使用了成员变量的尾随下划线,例如在着名的C++ FAQ Lite中。

我认为它的目的不是将变量标记为成员,而是“m_”的用途。它的实际目的是使一个名为field的访问器方法成为可能,如下所示:

class Foo {
public:
    bar the_bar() { return the_bar_; }
private:
    bar the_bar_;
}

让访问器省略“get_”部分在STL和boost中是常见的,我正在尝试尽可能接近这些开发编码风格,但我无法使用下划线技巧看到它们。我无法在STL中找到一个存取器或者只能返回一个私有变量的增强器。

我有几个问题我希望你能回答:

  1. 这个惯例来自哪里?短暂聊天? Objective-C的?微软?我想知道。
  2. 我是否会为所有私有成员使用尾随下划线,或者只是作为一种解决方法,以防我想要像变量一样命名函数?
  3. 你能指点一下STL或者是用来演示成员变量尾随下划线的代码吗?
  4. 有谁知道Stroustrup对这个问题的看法是什么?
  5. 你能指点我进一步讨论这个问题吗?

7 个答案:

答案 0 :(得分:31)

在C ++中,

  1. 标识符以下划线开头,后跟大写字符
  2. 在任何地方都有两个连续下划线的标识符
  3. 以下划线开头的全局命名空间中的标识符
  4. 保留给实现。 (关于这一点的更多信息可以找到here。)不是试图记住这些规则,许多人根本不使用以下划线开头的标识符。这就是发明尾随下划线的原因。

    然而,C ++本身已经陈旧,建立在40年的C之上(两者都没有一家公司支持它们),并且拥有一个已经“成长”数十年的标准库,而不是产生于一个创造的行为。这使得存在许多不同的命名约定。私有(或仅私有数据)的尾随下划线只有一个,许多使用其他的(其中很少有人认为,如果你需要下划线告诉私有成员来自局部变量,你的代码不够清晰)。

    至于吸气者/背叛者 - 他们是令人憎恶的,并且是quasi classes的确定标志,我讨厌。

答案 1 :(得分:16)

我已阅读 C ++编程语言,而Stroustrup并未使用任何类型的约定来命名成员。他从不需要;没有一个简单的访问器/ mutator,他有一种创建非常精细的面向对象设计的方法,因此不需要有一个相同名称的方法。只要他需要简单的数据结构,他就会使用公共成员的结构。他的方法似乎总是操作。我也读到某个地方,他不鼓励使用只有一个字符的名字。

答案 2 :(得分:12)

我个人是本指南的忠实粉丝:http://geosoft.no/development/cppstyle.html

它包括省略m_前缀,使用下划线后缀来指示私有成员变量,并删除使用下划线而不是空格的可怕的,令人讨厌的习惯,以及其他更详细和具体的建议,例如命名bool适当地(isDone而不仅仅是done)并使用getVariable()代替variable()来命名一些。

答案 3 :(得分:9)

只为自己说话...... 无论是否具有访问者功能,我总是对私有数据成员使用尾随下划线。我不主要使用m_,因为当我精神拼写变量的名字时它会妨碍我。

答案 4 :(得分:4)

作为一名喜欢搜索的维护开发人员,我倾向于m_,因为它更易于搜索。当你和我一起维持大班的大型项目时(不要问),你有时会想:“嗯,谁改变状态?”。快速搜索m_可以提示。

我也知道使用l_表示局部变量,但当前项目没有使用它,所以这些天我很“干净”。

我不是匈牙利乐谱的粉丝。 C ++有一个强类型系统,我改用它。

答案 5 :(得分:3)

我猜测乌托邦会使用领先的下划线 - 这在Java和C#中很常见。

然而,对于C来说,领先的下划线并不是一个好主意,因此我猜C ++ FAQ Lite推荐使用尾随下划线:

  

所有以。开头的标识符   下划线和大写   信或其他下划线   总是保留用于任何用途。

     

所有以。开头的标识符   下划线总是保留使用   作为两者中具有文件范围的标识符   普通和标签名称空间。

     
     

(ISO C99规范,第7.1.3节)

答案 6 :(得分:1)

据我记忆,不是微软推动了会员的尾随下划线代码风格。

我已经读到Stroustrup是专业的下划线。