c - 为什么 fabs() 在使用 GCC 编译时不需要 -lm 选项

标签 c gcc math.h

我写了一个简单的程序fabs.c来显示 float 的绝对值。

#include <stdio.h>
#include <math.h>

int main(void)
{
    float f;

    printf("Enter a floating-point number: ");
    scanf("%f", &f);

    printf("Its absolute value is %f.\n", fabs(f));
    return 0;
}

fabs() 函数需要包含math.h 头文件,但我在没有-lm 选项的情况下编译成功。

  gcc fabs.c -o fabs

甚至 man fabs 也说 link with -lm。但是不知道为什么不用-lm也能编译成功。

最佳答案

如果手册说您应该使用-lm 链接,那么您应该使用-lm 链接。在这种情况下,您的代码足够简单,并且编译器足够聪明,可以将其内联(因为您的系统始终使用内置的 gcc)。也许在某些情况下它无法做到。一些内置的浮点函数如果不能简单地内联(不是 fabs,而是许多其他的),就会回退到库函数。

手册通常会告诉您做并非在所有情况下都绝对必要的事情,因为说“做 X”比说“如果您做 A、B 但不做 C,您可能不必做”更容易X,但请阅读下一版本的手册,因为我们将添加 D,B 可能会更改,我们永远不会更改 A(除非我们改变主意)”。

通过与 -lm 链接,您可以确保您的程序在合理可预见的 future 能够在最合理的系统上运行。即使在这个特定的时间点在一台特定的机器上并不是绝对必要的,但是使用这个特定的代码,用你这次有的特定选项编译。

关于c - 为什么 fabs() 在使用 GCC 编译时不需要 -lm 选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46400205/

相关文章:

c - 使用 C 使用随机数填充和打印数组

c++ - 使用 g++ 编译多个源目录

c++ - 异步 C++11 中 future 的析构函数

java - 正弦函数的结果在微软和 Java/Linux 之间不同

c - 将 double 转换为 int 会返回向下舍入的数字吗?

c++ - 使用 fmod 和自己的实现的库 math.h

c - 为什么函数 SDL_WaitEvent (SDL2) 在我的代码中出现错误?

android - 没有 VAO 的 Opengles 2.0

c - Unix: 从 ( )

c - Ubuntu 中的 OpenGL(C 语言)说事情未声明