相关疑难解决方法(0)

常量表达式的数学函数是否在编译时预先计算?

我倾向于使用常量表达式的数学函数来获得方便性和连贯性(即log(x)/log(2)代替log(x)/0.3...).由于这些函数实际上并不是语言本身的一部分,它们都没有定义math.h(仅声明),常量的函数会在编译时预先计算,还是会在运行时浪费计算?

c math compile-time

12
推荐指数
2
解决办法
7114
查看次数

数学库中的文字常量与变量

所以,我知道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下使用.

c linker

5
推荐指数
2
解决办法
512
查看次数

标签 统计

c ×2

compile-time ×1

linker ×1

math ×1