Определение константы в c с помощью ключевого слова const - PullRequest
2 голосов
/ 07 июля 2019

Можете ли вы определить константу, используя ключевое слово const в C.

Я нахожу противоречивую информацию.

Использовал макрос #define и жесткий код для проверки значения.Код скомпилируется в этих случаях, но выдает ошибку, когда я использую ключевое слово const.

int main(void){

  const int  TESTARRAYSIZE = 7;
  float user_array[TESTARRAYSIZE] = {5.1, 7.2, 5.1, 8.45, 23.0,
                                       67.123, 5.1};
  float number_in_question = 5.1;

  float frequency;

  frequency = user_array[1];

  printf("%.2f", frequency);

  return(0);
}

ошибка компиляции: <filename>:22:3: error: variable-sized object may not be initialized

но эта ошибка в основном возникает, потому что константа не устанавливает значение.

Ответы [ 2 ]

3 голосов
/ 07 июля 2019

Использование квалификатора типа const не делает что-то постоянным.Константа в C имеет свое собственное определение.

См. § 6.7.3 ¶ 6 стандарта C11 для описания ключевого слова const:

Если предпринята попыткачтобы изменить объект, определенный с помощью const-квалифицированного типа, используя lvalue с не-const-квалифицированным типом, поведение не определено.Если предпринята попытка обратиться к объекту, определенному с типом, определенным с помощью volatile, с использованием lvalue с типом, не определенным с помощью volatile, поведение не определено.

Что вам нужно, так этопостоянное выражение;подробности см. в § 6.6 C11.

Если вы действительно задаетесь вопросом, не является ли "WTF справился с квалификатором const?"а скорее, каково правильное решение для вашего кода, ответ, скорее всего, просто не будет указывать размер массива:

float user_array[] = {5.1, 7.2, 5.1, 8.45, 23.0, 67.123, 5.1};

Это обычно считается хорошей практикой, поскольку на самом деле делает ваш код немного более устойчивым.

1 голос
/ 07 июля 2019

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

Как вы сказали, если вы #define значение не будет ошибки, потому что это известное жестко закодированное значение.

...