#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 не является постоянным выражением и, следовательно, не может использоваться в качестве размера массива. Сообщение об ошибке может быть получено в неправильной строке, но этот «ответ» не предоставляет решения.