【问题标题】:Gcc uses sqrt without including math.hGcc 使用 sqrt 不包括 math.h
【发布时间】:2015-09-26 15:21:47
【问题描述】:

有人知道为什么这个 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

【问题讨论】:

  • GCC 有一个内置的sqrt 函数,它可能会用对其内置函数的调用替换您的调用。既然您定义了该函数,它应该真正使用您的定义,也许是 GCC 中的错误?您使用的是什么版本的 GCC?
  • 我目前使用的是 4.8.3,我尝试删除 math_utils.h,它会给我这个错误main.c:5:18: warning: incompatible implicit declaration of built-in function 'sqrt' [enabled by default]
  • @JoachimPileborg 我相信 gcc 假定任何已识别函数的定义在范围内,它总是会执行 gcc 认为该函数应该执行的操作。
  • 来自标准(我的免费草稿副本)的第 7.1.3 节:“如果程序在保留它的上下文中声明或定义标识符(7.1.4 允许的除外) ),或将保留标识符定义为宏名称,则行为未定义。”也就是说, sqrt 不能用作函数的名称。所以这似乎是未定义的行为,而不是 GCC 中的错误。

标签: c gcc


【解决方案1】:

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

您可以通过提供 -fno-builtin 来关闭此行为,以关闭所有已识别函数的优化,或提供 -fno-builtin-<em>function</em> 以仅关闭 <em>function</em> 的优化。例如,-fno-builtin-sqrt 将使 gcc 尊重您的非标准 sqrt()

【讨论】:

  • 你是对的伙伴,它有效。谢谢你的解释。
  • @Snippet 我很高兴。
猜你喜欢
  • 2012-07-05
  • 2019-06-28
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 2013-09-26
  • 1970-01-01
  • 2017-11-26
相关资源
最近更新 更多