我想将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
选项,但它不接受
答案 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);
}
因为不能从函数返回值初始化全局变量。
还请注意,编译器会警告您将float
与double
混合使用。除非有充分的理由为什么您不能使用float
,否则请不要使用double
。