我写了一个简单的程序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/