标准库实现中四个双重不合理的原因

时间:2015-09-27 12:20:38

标签: c++ c libc libc++

标准库(C或C ++)实现是否有任何技术原因,IMO滥用,强调它们的方式(=使用两个非核心加上前缀+添加尾随下划线以表示变量是成员变量)?

我得到/.*__.*//_[A-Z].*/(< = regexes)是按实施方式保留的。但是,是不是应该参考编译器的实现而不是(标准)库?

在选择内部名称方面,标准库的行为与任何其他库一样吗?

1 个答案:

答案 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 ++标准中有描述),因此它可以使用保留的名称,但它喜欢。