考虑以下简短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.3
上Ubuntu 13.04
。
答案 0 :(得分:4)
在编译期间,编译器确定您正在调用具有常量文字作为唯一参数的函数。所以它可以通过替换函数调用的结果来优化。
它在编译时计算sqrt。请注意,它没有,在您的评论中建议,注入代码以在运行时计算它。
当然编译器只对某些函数执行此操作。
在此优化之后,没有要求在运行时调用sqrt,因此如果您没有链接它,则不会出现错误。
答案 1 :(得分:1)
我相信这是GCC用于浮动常量折叠的库: