【问题标题】:Why is everything in C++ capitalized? [closed]为什么 C++ 中的所有内容都大写? [关闭]
【发布时间】:2014-11-27 21:42:05
【问题描述】:

我通常使用 C#,而不是 C++,这就是我问这个问题的原因。

我已经看到在大多数 C++ 代码中使用下划线命名大写常量LIKE_THIS 是很正常的。

但是,当我看到 C++ 代码时(我见过的不多),它看起来与 C# 立即不同。除了泛型丰富的指针和不太正式命名/缩写的东西(如WndProc 和匈牙利符号)之外,一半的东西都是大写的。

即使不包括常量、方法名称、物理结构/C++ 事物本身 (HRESULT) 或有时甚至是物理数据类型 (BOOL) 之类的内容,也都是带有下划线的大写字母。

这在 C++ 风格中可能/可能不常见(尽管我在 google 上的任何地方都找不到它),为什么在这么多地方如此大量的大写字母很常见?或者,它是从哪里来的?

【问题讨论】:

  • 在 C++ 中,通常只有用 ALL_CAPS_WITH_INTERLEAVED_UNDERSCORES 编写的宏。这是 C 的传统:预处理器容易出错且容易被滥用,因此从一开始,C 程序员就倾向于使用出色的名称来命名预处理器宏。除此之外,匈牙利符号等。不完全是“常见的 C++ 风格”。你所说的是WinAPI的风格,充其量是“特殊的”。 (我会说“白痴”,但我怀疑有些 Windows 粉丝在这里偷偷摸摸。)
  • 开发人员可以使用任何适合他们喜欢的命名约定。没有人在乎,接受它并继续前进。
  • WinAPI 的 C++ 位也不使用全大写 (IUnkown)。 C 风格。
  • 这不是基于意见的。为什么这样做是一个公认的事实。是否是一个好主意是意见。投票重新开放。

标签: c++ coding-style


【解决方案1】:

我已经看到在大多数 C++ 代码中使用下划线命名大写常量 LIKE_THIS 是很正常的。

通常,全大写标识符用于宏,以避免与“真实”编译器名称混淆。因为在早期的 C 中,宏是使常量可用的唯一方法,例如在数组大小中,有些人对所有常量(或至少对enum 值)采用这种风格。就我个人而言,我只是将它们留给宏,在那里进行区分实际上很有用。

但是,当我看到 C++ 代码时(我见过的不多),它看起来与 C# 立即不同。除了通用的大量指针和不那么正式的命名/缩写的东西,如WndProc 和匈牙利符号之外,一半的东西都是大写的。

那就是 Windows API 风格,它来自 80 年代后期,所以看起来一点也不像 .NET 是正常的。

Windows 相关的类型通常都是大写,我怀疑这是因为它们也是宏(虽然目前它们都是typedefs) 实际上,我只是检查了@来自 Windows 1 SDK 的 987654329@,即使在那时它们也是 typedefs,所以这可能是某种风格选择;不过,常量仍然是宏。

匈牙利符号是由 Charles Simonyi 在 Microsoft 中发明的,并在 Windows 早期被内部广泛采用(并被误解)。

至于缩写,这是旧 API 的典型特征(看看 C 标准库或 POSIX API,它们甚至更简洁),我认为它可以通过技术和实践论证来证明:

  • 较旧的编译器和链接器had length limits for identifiers,这意味着它们不会区分仅与第六个字母以后不同的标识符;所以,你想在开头保留有意义的字母(顺便说一句,这似乎影响了 C 标准库 - 我听说 strncmpstrncat 和 co。因此在中间有 n) ;
  • 当您在 80x25 终端上工作时,您不想继续滚动阅读单行内容,因此 AttachedPropertyBrowsableWhenAttributePresentAttribute 之类的名称不会让您觉得这是一个绝妙的主意;
  • 此外,人们在 Visual Studio 和 IntelliSense 之前以 C++ 方式工作。我敢肯定,当时有些编辑器甚至有自动补全功能,但在更简单的编辑器中,您不想花一天时间手写ListViewVirtualItemsSelectionRangeChangedEventHandler

【讨论】:

【解决方案2】:

在 C 和 C++ 中广泛使用的约定是为 macros 而不是为 variablesfunctions 赋予全大写名称。这样的风格可以很容易地一眼看出哪些标识符是宏,哪些不是。这种风格在 K&R 中没有出现,所以我不知道它是如何起源的,但它在今天相当普遍。

在 C 中,宏用于定义常量。另一方面,在 C++ 中,常量通常是 const 变量。将常量声明为宏是 C 风格,但很多人用 C 风格编写 C++ 代码。

【讨论】:

  • C++ 从 C 继承了无作用域的 enums,如果预处理器不需要看到常量,这是另一种常用的定义常量的方法。
【解决方案3】:

所有您的示例都是特定于 WinAPI 而不是 C++ 的样式约定,而且 WInAPI 是 C API 而不是 C++ Api。

【讨论】:

    【解决方案4】:

    因为有人在 1975 年左右决定,需要将在预处理器中声明的标识符与在 C 语言中声明的标识符区分开来。

    我从来没有同意过,我从 1982 年就开始使用 C。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      • 2010-11-07
      • 2021-12-23
      • 2014-08-11
      • 2010-09-05
      • 1970-01-01
      • 2022-01-06
      相关资源
      最近更新 更多