如果我编写一个具有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函数都可以被覆盖,我不知道为什么。)
答案 0 :(得分:11)
程序的行为不确定。
[保留名称]
1 C ++标准库保留以下类型的名称:
1.1)—宏
1.2)—全局名称
1.3)—具有外部链接的名称
2如果程序在保留它的上下文中声明或定义了一个名称(本条明确允许的情况除外),则其行为未定义。[extern.names]
4使用外部链接声明的C标准库中的每个函数签名均保留给 既可以用作带有外部“ C”和外部“ C ++”链接的函数签名,也可以用作 全局名称空间中名称空间范围的名称。