Gcc使用sqrt而不包括math.h

时间:2015-09-26 15:21:48

标签: c gcc

任何人都知道为什么这个c程序编译并使用math.h的sqrt?

这将输出2.236068

的main.c

#include <stdio.h>
#include "math_utils.h"

int main(void){
  printf("%f\n", sqrt(5));
  return 0;
}

math_utils.h

#ifndef MATH_UTILS_Hs
#define MATH_UTILS_Hs

double sqrt(double number){
  return number + 5;
}

#endif // MATH_UTILS_Hs

我目前正在Windows上使用mingw GCC

1 个答案:

答案 0 :(得分:9)

gcc执行优化,它希望标准库函数的行为与标准所说的一样,即将调用C标准库转换为更高效的机器代码。例如,gcc可能会针对您的fsqrt来电发出一条sqrt()条指令,而根本不会调用您的自定义sqrt()

您可以通过提供-fno-builtin来关闭所有已识别的功能来关闭此优化,或者仅提供-fno-builtin-function来关闭function的此优化,从而关闭此行为。例如,-fno-builtin-sqrt会使gcc尊重您的非标准sqrt()