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

问题描述 投票:0回答:1

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

我明白了

/.*__.*/
/_[A-Z].*/
(<= regexes) are reserved-by-implementation. But isn't that supposed to refer to the implementation of the compiler rather than a (standard) library?

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

c++ c libc libc++
1个回答
5
投票

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

假设您编写了以下代码:

#include <iostream>

using namespace std;

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

int main()
{
  cout << square(3) << endl;
}

我想如果这最终调用了一些用于实现标准库的内部函数

square(int)
并做一些完全不同的事情,你会不高兴,因为它比你的
square(long)
更匹配
square(3)

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

现在您可能会说

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

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

#define value 15

#include <iostream>

int main()
{
  std::cout << value;
}

这是合法的代码,当然应该输出 15。但是现在想象一下,如果

iostream
中的某个对象声明了局部变量名称
value
会发生什么。你的代码显然无法编译。

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

© www.soinside.com 2019 - 2024. All rights reserved.