为什么添加 sqrt() 不会导致C++冲突?

Why doesn't adding sqrt() cause a conflict in C++?

本文关键字:C++ 冲突 添加 sqrt 为什么      更新时间:2023-10-16

如果我编写了一个具有C库函数签名的新函数,那么由于歧义,我预计会出现编译错误。但是,我不明白为什么在下面的C++代码中没有错误。

#include <iostream>
#include <cmath>
using namespace std;
double sqrt(double number)
{
return number * 2;  
}
int main( )
{
cout << sqrt(2.3) << endl;
cout << ::sqrt(2.3) << endl;
cout << std::sqrt(2.3) << endl;
return 0;
}

如果我将sqrt((的返回类型更改为int,那么由于cmath中的双sqrt(。如何覆盖double sqrt((?(实际上,所有的cmath函数都可以被覆盖,我不知道为什么。(

程序有未定义的行为。

[reserved.names]
1 C++标准库保留以下类型的名称:
1.1(-宏
1.2(-全局名称
1.3(-具有外部链接的名称
2如果程序在保留名称的上下文中声明或定义名称,而不是在本条款明确允许的上下文中,则其行为是未定义的。

[extern.names]
4使用外部链接声明的C标准库中的每个函数签名都保留给实现,用作带有extern"C"和extern"C++"链接的函数签名,或用作全局命名空间中命名空间作用域的名称。