【问题标题】:Why is "Init" in std::ios_base::Init uppercase? [closed]为什么 std::ios_base::Init 中的“Init”是大写的? [关闭]
【发布时间】:2015-05-11 05:06:26
【问题描述】:

std::ios_base::Init 外,标准C++ 库中的所有名称都是小写的。这是为什么呢?

【问题讨论】:

  • 我想说这仅仅是因为它为 IO 流做了很多重要的初始化、维护和清理工作。在这方面它是独一无二的,所以它得到了资本。
  • 向后兼容性。
  • 因为命名约定和 C++ 中的名称确实是一团糟,就像在 C 中一样。
  • 也许这个库是由一个“更了解”并且不想遵循惯例的程序员编写的。我在业内经常看到这种情况。

标签: c++ naming-conventions iostream c++-standard-library


【解决方案1】:

在 IOStream 类的早期 draft 中,您可以看到 ios_base 最初不存在,basic_ios 是基类并负责 Init 和其他成员,后来被分成 ios_base .

basic_ios 也有(和still has)一个init 函数,虽然这两个名称不一定必须不同,但大概是为了避免混淆,决定将类命名为Init 和函数init。此外,如果没有这种区别,则在使用该类时将需要以下内容:

struct ios_base
{
  struct init{};
  void init();
};

ios_base::init i1;        // error
struct ios_base::init i2; // ok

让一个单独的类负责初始化标准流的想法至少可以追溯到 CFront 3.0,这可以从 this 标头中的 Iostream_init 看出。在某些时候,决定不仅使该类成为 ios/ basic_ios / ios_base 的成员,而且还应将其重命名为 Init

无论如何,消除两者的歧义是有意义的,即使考虑到它们最终被放置在不同的类中。他们本可以选择完全独立的名称,但大概 Init / init 被认为是描述类和函数功能的最佳语义选择,而且它也有可能只是模仿旧的 Iostream_init,即由于某种原因也以大写I开头。

【讨论】:

  • “必须”太强了,但是是的,与基类的成员类同名的成员函数会导致该成员类被隐藏。
  • Hmm... 检查标准前的 libstdc++ 实现,在导致 C++98 标准的演变中,有一点是只有一个 ios 类包含 Initinit。在那一点上,不同的名字是绝对必要的,不仅仅是很好。
  • @hvd 感谢您的评论,我已经改写了答案,init / Init 的区别确实似乎是遥远过去的产物。我想指出的是,同名的函数和类仍然可以在同一个范围内愉快地共存。
  • @user657267 是的,不知何故我错过了。这会很不方便,但仍然不会要求使用不同的名称。
猜你喜欢
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多