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

mar*_*ark 4 c static gcc constants

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

static const int size = getSize();

int getSize() {
    return 50;
}
Run Code Online (Sandbox Code Playgroud)

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

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

我的问题是如何解决这个问题?

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

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

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

Jab*_*cky 5

与 C++ 不同,您不能使用 C 中函数的结果来初始化全局变量,而只能使用编译时已知的实数常量。

你需要写:

static const int size = 50;
Run Code Online (Sandbox Code Playgroud)

如果常数必须由函数计算,您可以这样做:

不再声明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();
  ...
Run Code Online (Sandbox Code Playgroud)

该方法SomeComplexFunctionOfYours()在第一次调用时只会被调用一次getSize()。有一个小小的代价:每次调用时getSize(),都需要执行测试。

或者你可以像这样显式初始化它,但size不能const再这样了:

static int size;

void InitializeConstants()
{
  size = SomeComplexFunctionOfYours();
}

int main(void)
{
  InitializeConstants();
  ...
  int somevar = size;
  ...
Run Code Online (Sandbox Code Playgroud)