C++的首选命名约定是什么?

6

我对查看boost库和stl以及查看别人的示例感到相当困惑。似乎大写的类型名称与全部小写用下划线分隔混合在一起。

这些天应该如何做事情呢?我知道.NET世界有他们自己的一套惯例,但它似乎完全不同于C++领域。

5个回答

9

你打开了一个棘手的问题。

C++标准库使用下划线命名法来表示所有内容,因为C标准库也是这样做的。

因此,如果您希望代码在各个方面看起来一致(并且实际上没有使用外部库),那么这是唯一的方法。

您会看到boost使用相同的符号,因为他们的库经常被考虑用于未来的标准。

除此之外,还有许多惯例,通常使用不同的符号来指定不同类型的符号。通常使用CamelCase来表示自定义类型,例如类和typedefs,以及mixedCase来表示变量,特别是为了区分这两种类型,但这肯定不是普遍的标准。

还有匈牙利命名法,它进一步区分特定的变量类型,尽管仅提到这个短语就可能引起一些程序员的敌意。

作为一名优秀的C++程序员,最好的答案是采用您正在接触的代码中使用的任何约定。


1
我建议阅读有关匈牙利命名法的内容。对于应用程序匈牙利命名法,我给予+1,对于系统匈牙利命名法,我给予-1(看看能否让人们阅读这篇文章)。 - David Rodríguez - dribeas
我最近偶然看到了那篇文章,我同意你的观点。我不得不放下对基于系统类型匈牙利命名法的所有反感情绪。 - Harper Shelby
@Harper:没错,但是真正的匈牙利命名法可以很有用:[[ double mLengthOfFootballField = 109.7, umHumanHairGrowthPerDay = 400; ]] 你可以通过混合前缀来检测错误的表达式:[[ mpsDecentRate = ftAltitudeDelta / sTimeDelta; // <-- bad! ]] - Aaron

2

没有一个很好的答案。如果你正在集成现有的代码库,那么匹配他们的风格是有意义的。如果你正在创建一个新的代码库,你可能想要建立简单的指南。

谷歌有一些相关指南


0

这将取决于库和组织的不同。

例如,对于我正在构建的开发人员实用程序库,我正在包括各种约定的友好包装器模块。因此,例如,MFC包装器模块使用“m_typeMemberVariable”符号表示成员,而STL包装器模块使用“member_variable”。我试图构建它,以便无论使用哪种前端,都具有该类型前端的典型样式。

普遍风格的问题在于,每个人都必须达成一致意见,例如,对于每个憎恶匈牙利符号的人,都有其他人认为不使用匈牙利符号会减少代码的可理解性的基本价值。因此,C++很难有一个通用标准。


尤其是在渴望了20多年之后 :) - baash05

0

我不喜欢Google C++风格指南 - 它建议避免使用异常等功能,这只是糟糕的编码实践(当然,这可能是您的修改之一,我不知道)。 - coppro
公正地说,它并没有真正“建议”避免异常。它只是承认,由于他们有一个非异常安全的代码库,在新代码中开始使用异常会很昂贵:“如果我们必须从头开始做这些事情,那么情况可能会不同”。 - Steve Jessop
话虽如此,在我看来,只要你在哪些 API 可以抛出异常和在必要时提供异常捕获适配器 API 上保持纪律,就可以逐渐将使用异常的代码工作到不安全的代码库中。但我能理解为什么任何公司都可能不想承受这种痛苦。 - Steve Jessop

0
历史上,在STL被创建之前,人们一直在使用C++进行编程。因此,当STL被创建时,它的编码风格只是众多风格之一。直到今天,仍然没有被普遍接受的命名约定。由于缺乏统一性,你能做到的最好就是在你的项目/公司/团队内保持一致性。
然而,使用现有的命名约定而不是自己编造一个是个好主意。以下是按字母顺序排列的一些流行命名约定列表,它们在今天仍在使用中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接