не может отображаться в константном выражении

#c #constant-expression

#c #constant-expression

Вопрос:

В следующей программе c :

 static const int row = (dynamic_cast<int>(log(BHR_LEN*G_PHT_COUNT)/log(2)));
static const int pht_bits = ((32*1024)/(G_PHT_COUNT * G_PHT_COUNT * BHR_LEN));
unsigned char tab[pht_bits][1<<row];
  

Я получаю сообщение об ошибке double log (двойной) ’ не может отображаться в константном выражении.
почему у меня возникает эта проблема, поскольку я поместил целочисленное приведение впереди? Как я должен это исправить?

Ответ №1:

Константное выражение, на которое ссылается компилятор, на самом деле является границами массива tab . Размеры статически распределенных массивов должны быть известны во время компиляции, но значение row не может быть определено до времени выполнения, поскольку оно вычисляется с использованием функции.

Комментарии:

1. Поддержал этот ответ за фактический ответ на вопрос.

Ответ №2:

Для вас, кто голосует против моего ответа. Скажите мне, что этот код не работает:

 #include <stdio.h>

double log(double foo)
{
  return 1.0;
}

static const int row = static_cast<int>(log(4)/log(2));

int main(void)
{
  printf("%dn", row);
  return 0;
}
  

Оригинал (изменен с (int) на static_cast, не то чтобы это имело значение)

 static const int row = static_cast<int>(log(BHR_LEN*G_PHT_COUNT)/log(2));
  

Комментарии:

1. Не следует использовать приведения в стиле C в C . Это также не решит проблему.

2. Этот «ответ» не отвечает на вопрос о том, почему возникает ошибка. Ответ Алекса правильно определяет, что логически постоянное значение row не является постоянным выражением и, следовательно, не может использоваться в качестве размера массива. Сообщение об ошибке может быть получено в неправильной строке, но этот «ответ» не предоставляет решения.