我倾向于使用常量表达式的数学函数来获得方便性和连贯性(即log(x)/log(2)代替log(x)/0.3...).由于这些函数实际上并不是语言本身的一部分,它们都没有定义math.h(仅声明),常量的函数会在编译时预先计算,还是会在运行时浪费计算?
所以,我知道C你需要将代码链接到数学库libm,以便能够使用它的功能.今天,当我试图向朋友证明这一点,并解释为什么你需要这样做时,我遇到了以下我不理解的情况.
请考虑以下代码:
#include <math.h>
#include <stdio.h>
/* #define VARIABLE */
int main(void)
{
#ifdef VARIABLE
double a = 2.0;
double b = sqrt(a);
printf("b = %lf\n",b);
#else
double b = sqrt(2.0);
printf("b = %lf\n",b);
#endif
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果VARIABLE已定义,则需要libm按照通常的预期进行链接; 否则你得到通常的main.c:(.text+0x29): undefined reference to sqrt链接错误,表明编译器找不到该函数的定义sqrt.我很惊讶地看到,如果我评论#define VARIABLE,代码运行正常,结果是正确的!
为什么libm在使用变量时我需要链接到但是在使用文字常量时我不需要这样做?编译器如何找到sqrt未链接库的定义?我gcc 4.4.5在linux下使用.