Я создаю массив в стеке как
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 является глобальным).