我最近在尝试执行以下逻辑时遇到了一些麻烦:
static const int size = getSize();
int getSize() {
return 50;
}
我收到的错误是initialiser element is not constant
在线阅读后我明白这个问题是因为编译器在编译时评估了static const
表达式,因此无法知道该值应该是什么。
我的问题是如何解决这个问题?
如果我有一个包含许多函数的库但它们都需要这个逻辑,那么它们应该如何使用它而不必每次都计算它?
即使他们必须这样做,如果逻辑本身可以在整个运行时间内改变,但我只想要从函数中获得的第一个值呢?
也许我应该澄清一下getSize中的逻辑只是一个例子,它也可能包含从特定文件中检索文件大小的逻辑。
与C ++不同,您不能使用C中的函数结果初始化全局变量,而只能使用编译时已知的实常数来初始化全局变量。
你需要写:
static const int size = 50;
如果必须通过函数计算常量,则可以执行以下操作:
不要再宣布static const int size = ...
,但写下这个:
int getSize()
{
static int initialized;
static int size;
if (!initialized)
{
size = SomeComplexFunctionOfYours();
initialized = 1;
}
return size;
}
int main(void)
{
...
int somevar = getSize();
...
这样,SomeComplexFunctionOfYours()
将在第一次调用getSize()
时被调用一次。需要付出很小的代价:每次调用getSize()
时,都需要进行测试。
或者你可以像这样明确地初始化它,但是qazxsw poi不能再是qazxsw poi了:
size
编译器需要在编译时知道常量变量的值,因为它是常量。
您也无法使用函数初始化变量。
你应该做这样的事情:
const