为什么不添加sqrt()在C ++中引起冲突?

时间:2019-10-28 16:36:03

标签: c++

如果我编写一个具有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函数都可以被覆盖,我不知道为什么。)

1 个答案:

答案 0 :(得分:11)

程序的行为不确定。

  

[保留名称]
  1 C ++标准库保留以下类型的名称:
  1.1)—宏
  1.2)—全局名称
  1.3)—具有外部链接的名称
  2如果程序在保留它的上下文中声明或定义了一个名称(本条明确允许的情况除外),则其行为未定义。

     

[extern.names]
  4使用外部链接声明的C标准库中的每个函数签名均保留给   既可以用作带有外部“ C”和外部“ C ++”链接的函数签名,也可以用作   全局名称空间中名称空间范围的名称。