Инициализация статической переменной const из функции в c - PullRequest
0 голосов
/ 22 февраля 2019

Недавно я столкнулся с некоторыми проблемами при попытке выполнить следующую логику:

static const int size = getSize();

int getSize() {
    return 50;
}

Полученная ошибка: initialiser element is not constant

Прочитав в Интернете, я понимаю, что эта проблемапотому что компилятор оценивает выражение static const при компиляции и поэтому не может знать, какое значение должно быть.

Мой вопрос: как мне обойти это?

Если у меня естьбиблиотека, которая содержит много функций, но все они требуют этой логики, как они должны использовать ее без необходимости каждый раз вычислять ее?

И даже если они должны это сделать, что, если сама логика может изменяться во время выполнения, но я хочу, чтобы только первое значение, которое я получаю от функции?

Возможно, я должен уточнить, что логика вgetSize - это просто пример, он также может содержать логику, которая извлекает размер файла из определенного файла.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Компилятору нужно знать значение вашей постоянной переменной во время компиляции, потому что она постоянная.

Также вы не можете инициализировать переменную с помощью функции.

Вы должнысделать что-то вроде этого:

#define SIZE 50

static const int size = SIZE;
0 голосов
/ 22 февраля 2019

В отличие от 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;
  ...
...