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

标签 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 行,那么我们会得到一个编译时错误 对 sqrt' 的 undefined reference ,只能通过使用 gcc Foo.c -lm 进行编译来修复。

我在 Ubuntu 13.04 上使用 gcc 4.7.3

最佳答案

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

它在编译时计算 sqrt。请注意,您的评论中建议,它不会注入(inject)代码以在运行时计算它。

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

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

关于c - 为什么编译时已知常数的平方根不需要链接数学库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21808271/

相关文章:

c - 需要帮助修复近似 pi 的算法

c++ - 将 UNALIGNED MSVC 特定代码转换为可移植 C++ 代码?

c++ - 为什么类的析构函数在只包含类的头文件的cpp中是 "inlined"

c++ - 表达式中运算符的 GCC 和 ADL

c - 我应该学习汇编语言或 C 来理解 "real programming"是如何工作的吗?

c - 关于gcc编译命令的问题

c - C 中的函数参数更改

c++ - 是否可以以编程方式将 SQLite 数据库转换为 C/C++ 中的 SQL 语句?

c - Linux设备驱动程序中的多重定义错误

c++ - 为什么 clang++ 编译的文件与 g++ 不同?