66

我是一个相当菜鸟的 C++ 程序员,但在我有限的语言经验中,大多数标准 C++ 样式指南(例如Google C++ 样式指南)与 stl 和 boost 库中实现的内容背道而驰。

例如,C++ 标准库和 Boost 中的类名总是小写,用下划线分隔单词(例如std::vector, boost::unordered_map, std::map::const_iterator),而我看到的大多数 C++ 样式指南倾向于 CamelCase 样式(例如TcpConnectionor Int32)。

这同样适用于方法。标准库和 Boost 对方法和函数使用与类(例如std::map<>::get_equal("foo"))相同的风格,而大多数风格指南提倡 pascalCase 或 CamelCase。

如果我们将其与 Ruby 之类的语言进行对比,大多数用户将遵守核心库中使用的约定,标准 C++ 库与其他所有人的代码之间存在如此大的差异似乎很奇怪。

有人知道为什么吗?

编辑:为了澄清,我只是在谈论肤浅的文本风格(大小写、下划线的使用等),而不是实际的实现风格。

4

3 回答 3

41

下划线和小写字母是 Bjarne Stroustrup 在“C++ 编程语言”中所采用的风格。如果我没记错的话,他曾发表过这样的声明,即首选名称中的下划线,因为对于英语不是主要语言的国际社会来说,它更具可读性。我不知道他的意见是否正确,但我猜这就是起源。

这是他的常见问题解答的链接,他在其中讨论了这个主题:

http://www.stroustrup.com/bs_faq2.html#Hungarian

片段解释了您特别感兴趣的内容:

我更喜欢使用下划线来分隔标识符(例如 element_count)中的单词,而不是使用其他选项,例如 elementCount 和 ElementCount。永远不要使用全大写字母的名称(例如,BEGIN_TRANSACTION),因为这通常是为宏保留的。即使您不使用宏,也可能有人在您的头文件中乱扔了它们。类型使用首字母大写(例如 Square 和 Graph)。C++ 语言和标准库不使用大写字母,所以它是 int 而不是 Int 和 string 而不是 String。这样,您就可以识别标准类型。

于 2012-12-14T16:01:36.560 回答
8

除了 Bjarne Stroustrup 之外,还有一个很好的理由。使用仿函数时,您希望它们看起来像函数。

但是使用 CamelCase 样式指南,您可以通过在类名称的第一个字符上使用大写字母并在方法的第一个字符上使用小写字母来区分类与方法和函数。

这与 c++ 算法风格的编程不一致。由于没有理由将仿函数与函数区分开来,因此当您想要使用仿函数(通常是您想要的)时,最好使用 c++ 和 stl 编码样式。

于 2012-12-14T17:28:06.903 回答
4

唯一真正需要的规则是那些旨在防止已知问题的规则:

  • 使用 ALL_CAPS(加上下划线和数字)作为预处理器名称,并且仅用于预处理器名称。追查由(假定的)非预处理器标识符和预处理器名称之间的冲突引起的问题可能很困难,更难修复它们。
  • 永远不要使用下划线开头的标识符,并且在标识符内的任何地方都不要有双下划线。这些是为实现而保留的。

除此之外,保持一致,不要太挑剔。编码标准应该注意规则#0,即“不要为小事操心”。太多的编码标准让小东西汗流浃背。

就 Google 的 C++ 标准而言,它并不是最好的。它更像是一个 C 正负标准。例如,它禁止通过非常量引用传递。

于 2012-12-14T18:19:57.103 回答