标准库以两个下划线开头的内部名称是有充分理由的:此类名称是为实现保留的。
想象一下您编写了以下代码:
#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++ 标准中描述的),因此它可以随意使用保留名称。