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

考虑以下简短的C程序:

 #include  #include  #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进行编译来修复。 。

我在Ubuntu 13.04上的gcc 4.7.3

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

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

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

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

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