1

我想将结果分配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,但我使用-pedanticgcc 中的选项,它不接受它。

4

3 回答 3

6

假设这f是在全球范围内声明的。

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

所以

const float f = log10(2);

不是有效的 C,而

const float f = 0.30102999566;

已验证。

来自C 参考

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

于 2018-07-20T17:54:33.673 回答
2

您的问题是 iff是一个全局变量,在 C 中您需要一个编译时常量表达式来初始化它,而编译时常量表达式不能包含函数调用,例如log10().

如果你可以移动这条线

const float f = log10(2);

intomain或其他一些功能,它会起作用。

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

float f;

然后在main()早期

f = log10(2);

但缺点是(a)f不能const和(b)将初始化移入main是一件麻烦事。

你可以做

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

但缺点很明显。

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

const float f = log10(2);

会工作的,我相信。

于 2018-07-20T17:52:15.307 回答
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.

于 2018-07-20T17:56:06.417 回答