【问题标题】:Initialising a static const variable from a function in c从c中的函数初始化静态常量变量
【发布时间】:2019-02-22 16:11:58
【问题描述】:

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

static const int size = getSize();

int getSize() {
    return 50;
}

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

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

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

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

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

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

【问题讨论】:

  • 如果你不知道编译时的值,它不是一个常量,所以去掉 const 关键字。
  • 还有“static const int size = getSize();”如果该行只是放在文件中,则永远不会编译。这不是 Python :) 你只能从其他函数调用函数。
  • @Fredrik 有没有办法确保没有 const 限定符就不能更改它?
  • 在 C++ 中,您可以使用函数初始化全局变量。在 C 中,你不能。
  • 顺便说一句:你写 它还可以包含从特定文件中检索文件大小的逻辑。:但它不再是一个常量......

标签: c gcc static constants


【解决方案1】:

与 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;
  ...

【讨论】:

  • 如果逻辑比这更复杂怎么办?
  • 如果必须,您甚至可以#define size getSize() 避免更改代码中的所有引用。这不是很令人愉快,但从短期来看,它可能比其他选择更好。
  • @NateEldredge 将size 重构为getSize() 没什么大不了的,我建议不要用#define“作弊”
【解决方案2】:

编译器需要在编译时知道你的常量变量的值,因为它是一个常量。

你也不能用函数初始化变量。

你应该这样做:

#define SIZE 50

static const int size = SIZE;

【讨论】:

    猜你喜欢
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 2014-06-06
    • 2012-10-26
    • 1970-01-01
    相关资源
    最近更新 更多