标准库(C或C ++)实现是否有任何技术原因,IMO滥用,强调它们的方式(=使用两个非核心加上前缀+添加尾随下划线以表示变量是成员变量)?
我得到/.*__.*/
和/_[A-Z].*/
(< = regexes)是按实施方式保留的。但是,是不是应该参考编译器的实现而不是(标准)库?
在选择内部名称方面,标准库的行为与任何其他库一样吗?
答案 0 :(得分:3)
标准库有一个很好的理由来启动带有两个下划线的内部名称:这些名称是为实现保留的。
想象一下,您编写了以下代码:
#include <iostream>
using namespace std;
long square(long x)
{
return x*x;
}
int main()
{
cout << square(3) << endl;
}
我想如果最终调用一些内部函数square(int)
来实现标准库并执行完全不同的操作,我想你会感到高兴,因为它比square(long)
更适合square(3)
1}}。
通过在所有内部名称前加上双下划线,同时标准声明您不允许这样做,标准库作者确保不会发生类似这样的事情。
现在您可能会说<iostream>
不是STL的一部分,但每个标准库头可能包含任何其他标准库头,因此iostream
可能包含一个STL头,用于其实现
即使在外部看不到的本地标识符的情况下,具有双下划线的标识符的另一个原因是您可能已经定义了同名的宏。考虑:
#define value 15
#include <iostream>
int main()
{
std::cout << value;
}
这是合法代码,当然应输出15.但现在想象一下,如果iostream
中的某个对象声明了一个局部变量名为value
,会发生什么。你的代码显然不会编译。
请注意,标准库是实现的一部分(毕竟它在C ++标准中有描述),因此它可以使用保留的名称,但它喜欢。