为什么在编译时已知的常数的平方根不需要链接数学库?

mer*_*011 3 c gcc

考虑以下简短C程序:

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


#define K 20
// int K = 20;

int main() {
    printf("%f\n", sqrt(K));
}
Run Code Online (Sandbox Code Playgroud)

如给定的那样,该程序使用进行编译gcc Foo.c,并产生正确的输出。

但是,如果我们#define在行中注释掉并在行中注释int K = 20,则将得到的编译时错误undefined reference to sqrt',只能通过使用进行修复gcc Foo.c -lm

gcc 4.7.3继续Ubuntu 13.04

har*_*mic 5

在编译过程中,编译器确定您正在以常量常量作为唯一参数调用函数。因此,它可以通过替换函数调用的结果来进行优化。

它在编译时计算sqrt。请注意,在您的注释中建议不要将其注入代码以在运行时进行计算。

当然,编译器只能对某些功能执行此操作。

优化之后,无需在运行时调用sqrt,因此,如果未链接它,则不会出现错误。


归档时间:

查看次数:

968 次

最近记录:

11 年,6 月 前