【问题标题】:Naming convention for Win32/MFC with C++使用 C++ 的 Win32/MFC 的命名约定
【发布时间】:2012-01-19 22:56:26
【问题描述】:

我正在使用 Visual Studio 2010 开发一个使用 Win32/MFC 框架和 C++ 编程语言的应用程序。

我的问题是变量、函数名、类名等需要使用哪种命名约定。我听说微软建议使用“匈牙利符号”命名约定。

您能告诉我使用哪种标准吗?

【问题讨论】:

    标签: c++ visual-studio-2010 winapi mfc


    【解决方案1】:

    可能确实有充分的理由希望其他学习过 MFC 的程序员看起来熟悉您的代码。如果是这样,那么您可以效仿MFC Samples and Tutorials 的约定,并按照他们的做法...

    但是 MFC 是一个很早就出现的遗留库,而且时代已经改变。 Microsoft 的样式指南现在明确规定 NOT 使用匈牙利符号:

    http://msdn.microsoft.com/en-us/library/ms229042.aspx

    除此之外,与其盲目遵循任何特定文档,不如评估每个单独的约定。例如,当 MFC 示例创建类并具有成员变量时,它们的名称以 m_ 开头。 StackOverflow 对这个特定想法有疑问,您可以阅读替代方案:

    Why use prefixes on member variables in C++ classes

    我更符合 Qt 的 API 样式指南,他们的大部分约定对我有用:

    http://doc.qt.nokia.com/qq/qq13-apis.html

    说到这一点,Qt 是一个不错的 C++ 产品,它一直在不断发展和成熟。将 MFC 从水中吹走(完全)并且是跨平台的......

    http://qt.nokia.com/products/developer-tools/

    如果您想被锁定在 Microsoft 世界中,请选择 .NET 和 C#。这将是一个进步,您不会被 MFC 废弃软件卡住。

    【讨论】:

    • 您发布的有关匈牙利符号的链接,不涉及 C++/MFC。此外,您可能想省略您的个人偏好,因为它并不能真正回答问题。
    • @JörgenSigvardsson 你不会在 2011 年找到与 MFC 编程相关的规范正式实践文档。微软从未在他们自己的产品中使用它,现在几乎不支持它。我引用了唯一可以找到可遵循实践的地方,那就是古老的 MFC 示例,因此最好从现代系统中汲取经验。如果您真的想深入分析 MFC 示例和源代码使用匈牙利符号的方式(并认为这是 “答案”),那么请务必发布它,而不是告诉我在 StackOverflow 上的答案中“忽略我的个人偏好”。
    • 在这里,我认为 SO 是为了帮助人们,而不是怜悯。我不会妨碍你。
    • @JörgenSigvardsson 再次重申:如果您的对帮助的想法与我的不同,那就太好了,请按照这种方式回答。但是,如果有人说他们正在开始一个新的 MFC 项目并对代码质量表示好奇——这与询问维护一些遗留代码是不同的。如果有人在 2011 年将 MFC 和“最佳实践”放在一起,那么 某事 是不对的,重要的是要确保他们知道它已经死了。因为旧书、陈旧的网页和历史悠久的 Microsoft 营销不一定会告诉他们这一点。
    • @JörgenSigvardsson 关于匈牙利符号的链接确实讨论了 C++/MFC,您只需要深入挖掘一下。遵循“名称指南”和“通用命名约定”到 msdn.microsoft.com/en-us/library/ms229045.aspx,其中明确指出“不要使用匈牙利符号”。
    【解决方案2】:

    哦,孩子。这几乎就像问人们你应该遵循什么宗教一样。至少你没有问你应该使用什么文本编辑器......

    我的 2c:做对你有用的事。还要考虑您是否只是为自己编码,或者您是否希望其他人阅读或使用您编写的代码,以及您是从头开始项目,还是在现有代码的基础上构建。

    命名约定其实并不重要,只要:

    • 您选择有意义的名称并描述变量/函数/其他的用途。 (这里的关键问题是目的;让编译器处理类型。)

    • 在应用约定的任何其他方面(缩进、大小写、前缀、下划线的使用等)方面保持一致。

    一般来说,如果代码写得好,约定的细节并不重要。

    至于匈牙利语和前缀:Win32 和 C++ 仍然在一定程度上使用它们,而 .Net 和 C# 则没有。

    我强烈建议您阅读此long but very insightful article by Joel Spolsky,它详尽地概述了前缀约定如何以及为什么实际上非常有用(如果操作正确,以及它只是无意义的苦差事)。

    这些天来,我不关心大多数匈牙利前缀,除了少数(请注意,这些只是我个人的喜好,多年来我发现它们很有用):

    • p 用于指针,因为在 C++ 中,与 C# 不同,了解何时处理引用与对象以及处理的间接级别非常有用。
    • m_ 用于成员变量(有时在 C# 中使用 _ 取决于现有代码;请参阅下面 HostileFork 的注释,将 _ 作为 C++ 中的前缀。)
    • cch 用于字符计数,cb 用于字节计数。在 Win32 中,不要把这些弄混,这真的很重要;将字符数传递给 memcpy 或将字节数传递给 GetWindowText,你就会遇到麻烦。这是一种前缀的使用,可以帮助您保持代码清晰且明显正确(或不正确,视情况而定 - “啊,当然,我将 cch 传递给 memcpy,这就是问题所在!”)。

    对我来说,前两个有助于使代码更具可读性;这里的第三个示例有助于提高可读性,但也可以是确保正确性的有用技术 - 有点像助记符,如果你愿意的话。

    【讨论】:

    • +1 不要与合作者就既定标准争吵(在罗马时...) 我会提出以_ 开头的名字,然后是小写字母由 C++ 保留用于编译器的私有实现。如果要使用下划线,则它们应位于成员名称的末尾。正确的 C++(例如:通过引用 GetWindowText 而不是内存缓冲区和长度来传递 CString)通常可以减轻对 CCH/CB 的担忧……因此,应该审查您必须担心的情况以进行适当的抽象使用。以p 开头会让你的IDE 看起来无法提示你,所以它有点过时了。
    • _ 的好点。对我来说,p 前缀部分是“文化的”;它在几乎所有 Win32/COM 代码/示例/文章中无处不在 - 以至于没有它,代码可能看起来像 C++,但看起来不像“Win32/COM”并且感觉不对。是的,它已经过时了;但 Win32/COM 也是如此 - 所以它的使用日期恰当:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    相关资源
    最近更新 更多