将`log10(2)`的结果赋给常量

时间:2018-07-20 17:40:43

标签: c function constants return-value return-type

我想将log10(2)的结果分配给一个常量。

我做到了

const float f = log10(2);

它告诉Initializer element is not a constant expression。我还定义了一个新功能

const float Log10(float f) {
    return (const float)log10(f);
}

但是编译器在抱怨(为什么不呢?我也在使用log10函数)那个Type qualifiers are ignored on function's return type。这是否意味着没有可以返回常量的函数?那我该怎么办呢?

编辑:

有些人对此表示怀疑,我加入了math.h头文件并将其链接到-lm,但是我在gcc中使用了-pedantic选项,但它不接受

3 个答案:

答案 0 :(得分:6)

假设f是在全局级别声明的。

与C ++不同,C不允许在初始化全局变量时使用运行时表达式。所有表达式在编译时都必须是可计算的。

因此

const float f = log10(2);

不是有效的C,而

const float f = 0.30102999566;

有效。

来自C Reference

  

初始化具有静态或线程本地存储持续时间的对象时,初始化器中的每个表达式都必须是常量表达式或字符串文字。

答案 1 :(得分:2)

您的问题是,如果f是全局变量,则在C中,您需要一个编译时常量表达式来对其进行初始化,并且编译时常量表达式不能包含诸如{{1} }。

如果可以移动线

log10()

插入const float f = log10(2); 或其他功能,它将起作用。

如果需要它是全局的,则可以将其声明为

main

然后在float f; 组的早期

main()

但是缺点是(a)f = log10(2); 不能是f,并且(b)将初始化转移到const是很麻烦的事情。

你可以

main

但是缺点很明显。

或者您可以使用C ++,其中对编译时表达式的限制已大大放松,并且

const float f = 0.301029995663981;   /* log10(2) */

我相信这会工作。

答案 2 :(得分:1)

这将起作用

#include <stdio.h>
#include <math.h>

int main() { 
    const float f = log10(2);
    printf("%f\n", f);
}

但这不起作用

#include <stdio.h>
#include <math.h>

const float f = log10(2);

int main() { 
    printf("%f\n", f);
}

因为不能从函数返回值初始化全局变量。

还请注意,编译器会警告您将floatdouble混合使用。除非有充分的理由为什么您不能使用float,否则请不要使用double