Определение массива. Выражение должно иметь постоянное значение.

Я создаю массив в стеке как

static const int size = 10; void foo() { .. int array[size]; .. } 

Однако я получаю ошибку компиляции: «выражение должно иметь постоянное значение», хотя размер является константой. Я могу использовать макрос

 #define SIZE (10) 

Но мне интересно, почему size обозначенный const вызывает ошибку компиляции.

В языке C ключевое слово const имеет ничего общего с константами . В языке C по определению термин «константа» относится к буквальным значениям и константам enums. Это то, что вам нужно использовать, если вам действительно нужна константа : либо используйте значение буквального выражения (укажите макрос, чтобы указать постоянное имя), либо используйте константу enum.

(Читайте здесь для более подробной информации: Должен ли я предпочитать константы над определениями? )

Кроме того, в C99 и более поздних версиях языка можно использовать непостоянные значения в качестве размеров массива для локальных массивов. Это означает, что ваш код должен компилироваться в современном C, даже если ваш size не является постоянным. Но вы, по-видимому, используете старый компилятор, поэтому в вашем случае

 #define SIZE 10 

это правильный путь.

Ответ в другом вопросе stackoverflow, ЗДЕСЬ

это потому, что объекты C, объявленные с помощью модификатора const, не являются истинными константами. Лучшее имя для const, вероятно, было бы readonly – на самом деле это означает, что компилятор не позволит вам его изменить. И вам нужны истинные константы для инициализации объектов со статическим хранилищем (я подозреваю, что regs_to_read является глобальным).