从C中的函数初始化静态const变量

时间:2019-02-22 16:11:59

标签: c gcc static const

我最近在尝试执行以下逻辑时遇到了一些麻烦:

static const int size = getSize();

int getSize() {
    return 50;
}

我收到的错误是initialiser element is not constant

在线阅读后,我了解到这个问题是因为编译器在编译时会评估static const表达式,因此无法知道该值是什么。

我的问题是我该如何解决?

如果我有一个包含许多函数的库,但是它们都需要此逻辑,那么应该如何使用它而不必每次都进行计算?

即使必须这样做,如果逻辑本身可以在整个运行时更改,但我只想要从函数中收到的第一个值怎么办?

也许我应该澄清一下getSize中的逻辑只是一个例子,它也可能包含从特定文件中检索文件大小的逻辑。

2 个答案:

答案 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;