我最近在尝试执行以下逻辑时遇到了一些麻烦:
static const int size = getSize();
int getSize() {
return 50;
}
我收到的错误是initialiser element is not constant
在线阅读后,我了解到这个问题是因为编译器在编译时会评估static const
表达式,因此无法知道该值是什么。
我的问题是我该如何解决?
如果我有一个包含许多函数的库,但是它们都需要此逻辑,那么应该如何使用它而不必每次都进行计算?
即使必须这样做,如果逻辑本身可以在整个运行时更改,但我只想要从函数中收到的第一个值怎么办?
也许我应该澄清一下getSize中的逻辑只是一个例子,它也可能包含从特定文件中检索文件大小的逻辑。
答案 0 :(得分:3)
与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()
时,都需要执行测试。
或者您可以像这样显式地初始化它,但是size
不再是const
:
static int size;
void InitializeConstants()
{
size = SomeComplexFunctionOfYours();
}
int main(void)
{
InitializeConstants();
...
int somevar = size;
...
答案 1 :(得分:0)
编译器需要在编译时知道常量的值,因为它是一个常量。
此外,您不能使用函数初始化变量。
您应该执行以下操作:
#define SIZE 50
static const int size = SIZE;