标准库实现中四个双下划线的原因

PSk*_*cik -2 c c++ libc libc++

标准库(C 或 C++)实现是否存在任何技术原因(IMO 滥用),强调它们的做法(= 用两个下划线作为所有内容的前缀 + 添加尾部下划线以表示变量是成员变量)?

我明白了/.*__.*/并且 /_[A-Z].*/(<= regexes) 是由实现保留的。但这不是应该指编译器的实现而不是(标准)库吗?

标准库在选择内部名称方面不能像其他库一样吗?

cel*_*chk 5

标准库以两个下划线开头的内部名称是有充分理由的:此类名称是为实现保留的。

想象一下您编写了以下代码:

#include <iostream>

using namespace std;

long square(long x)
{
  return x*x;
}

int main()
{
  cout << square(3) << endl;
}
Run Code Online (Sandbox Code Playgroud)

我想如果这最终调用了一些用于实现标准库的内部函数并做了一些完全不同的事情,你会不高兴,因为它比你的forsquare(int)更好匹配。square(long)square(3)

通过在所有内部名称前面添加双下划线前缀,同时标准声明不允许您这样做,标准库作者确保不会发生类似的情况。

现在您可能会说这<iostream>不是 STL 的一部分,但每个标准库标头都可能包含任何其他标准库标头,因此iostream很可能包含一个在其实现中使用的 STL 标头。

即使在外部看不到的本​​地标识符的情况下,带有双下划线的标识符也有意义的另一个原因是您可能已经定义了同名的宏。考虑:

#define value 15

#include <iostream>

int main()
{
  std::cout << value;
}
Run Code Online (Sandbox Code Playgroud)

iostream这是合法的代码,当然应该输出 15。但是现在想象一下,如果某个对象声明了局部变量名称,会发生什么value。你的代码显然无法编译。

请注意,标准库是实现的一部分(毕竟它是在 C++ 标准中描述的),因此它可以随意使用保留名称。

  • @black:这个问题显然不属于“机械土耳其人”类别。我也不同意这是一个糟糕的问题。 (3认同)
  • @PSkocik:再想一想,它实际上是有道理的:毕竟,您可以定义一个同名的宏。我会修改答案。 (2认同)