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

时间:2014-02-16 06:56:30

标签: c gcc

考虑以下简短C计划:

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


#define K 20
// int K = 20;

int main() {
    printf("%f\n", sqrt(K));
}

这个程序,如给定的,用gcc Foo.c编译,并产生正确的输出。

但是,如果我们注释掉#define行,并在int K = 20行中发表评论,那么我们会得到undefined reference to sqrt'的编译时错误,只能通过编译来修复与gcc Foo.c -lm

我在gcc 4.7.3Ubuntu 13.04

2 个答案:

答案 0 :(得分:4)

在编译期间,编译器确定您正在调用具有常量文字作为唯一参数的函数。所以它可以通过替换函数调用的结果来优化。

它在编译时计算sqrt。请注意,它没有,在您的评论中建议,注入代码以在运行时计算它。

当然编译器只对某些函数执行此操作。

在此优化之后,没有要求在运行时调用sqrt,因此如果您没有链接它,则不会出现错误。

答案 1 :(得分:1)

我相信这是GCC用于浮动常量折叠的库: