46

I've seen people use a trailing underscore for member variables in classes, for instance in the renowned C++ FAQ Lite.

I think that it's purpose is not to mark variables as members, that's what "m_" is for. It's actual purpose is to make it possible to have an accessor method named like the field, like this:

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

Having accessors omit the "get_" part is common in the STL and boost, and I'm trying to develop a coding style as close to these as possible, but I can't really see them using the underscore trick. I wasn't able to find an accessor in STL or boost that would just return a private variable.

I have a few questions I'm hoping you will be able to answer:

  1. Where does this convention come from? Smalltalk? Objective-C? Microsoft? I'm wondering.
  2. Would I use the trailing underscore for all private members or just as a workaround in case I want to name a function like a variable?
  3. Can you point me to STL or boost code that demonstrates trailing underscores for member variables?
  4. Does anybody know what Stroustrup's views on the issue are?
  5. Can you point me to further discussion of the issue?
4

7 回答 7

38

在 C++ 中,

  1. 以下划线开头,后跟大写字符的标识符
  2. 任何地方都有两个连续下划线的标识符
  3. 全局命名空间中以下划线开头的标识符

保留给实现。(可以在此处找到有关此内容的更多信息。)许多人没有尝试记住这些规则,而是根本不使用以下划线开头的标识符。这就是发明尾随下划线的原因。

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

至于 getter/setter - 他们是可憎的,并且是我讨厌的准类”的明确标志。

于 2010-09-06T12:13:08.057 回答
16

我读过The C++ Programming Language和 Stroustrup 没有使用任何命名成员的约定。他从来不需要;没有一个简单的访问器/修改器,他有一种创建非常精细的面向对象设计的方法,因此不需要同名的方法。只要他需要简单的数据结构,他就会使用带有公共成员的结构。他的方法似乎总是在操作。我还在某处读到过,他不鼓励使用仅相差一个字符的名称。

于 2010-09-28T15:32:33.493 回答
13

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

它包括省略 m_ 前缀,使用下划线后缀来指示私有成员变量,并放弃使用下划线而不是空格的可怕、烦人的打字习惯,以及其他更详细和具体的建议,例如适当地命名布尔值(isDone而不是of just done) 和 usinggetVariable()而不是variable()仅举几例。

于 2010-09-06T11:15:01.067 回答
11

只为我自己说话......我总是对私有数据成员使用尾随下划线,无论它们是否具有访问器功能。我不使用 m_ 主要是因为它妨碍了我在脑海中拼写变量的名称。

于 2010-09-06T10:25:05.460 回答
5

作为一个喜欢可搜索性的维护开发人员,我倾向于m_它更具可搜索性。当您像我一样维护大型项目时(不要问),您有时会想:“嗯,谁改变了状态?”。快速搜索m_可以给出提示。

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

我不喜欢匈牙利符号。C++ 有一个强大的类型系统,我用它来代替。

于 2010-09-06T16:34:27.863 回答
3

I'm guessing that utopia would have been to use a leading underscore - this is quite common in Java and C# for members.

However, for C, leading underscores aren't a good idea, so hence I guess the recommendation by the C++ FAQ Lite to go trailing underscore:

All identifiers that begin with an underscore and either an uppercase letter or another underscore are always reserved for any use.

All identifiers that begin with an underscore are always reserved for use as identifiers with file scope in both the ordinary and tag name spaces.


(ISO C99 specification, section 7.1.3)

于 2010-09-06T12:30:02.427 回答
1

据我记得,不是微软为成员推动了尾随下划线代码样式。

我读过 Stroustrup 是支持尾随下划线的。

于 2010-09-06T11:25:43.537 回答