gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:17:58 28 4
gpt4 key购买 nike

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

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

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

最佳答案

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

假设您编写了以下代码:

#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 header 。

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

#define value 15

#include <iostream>

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

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

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

关于c++ - 标准库实现中双下划线的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32807815/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com