Почему же компилятор считает, что эта переменная не является константой? - PullRequest
3 голосов
/ 16 декабря 2010

Это мой код:

int main()
{
 const int LEN = 5;
 int x[LEN];
}

VS10 говорит:

ошибка C2057: ожидаемая постоянная выражение

ошибка C2466: невозможно выделить массив постоянного размера 0

ошибка C2133: 'x': неизвестный размер

Я даже попробовал код на этой странице, и он дает ту же проблему (я прокомментировал код, который выдает ошибку, и раскомментировал правильный): http://msdn.microsoft.com/en-us/library/eff825eh%28VS.71%29.aspx

Если бы я пробовал дерьмовый компилятор, я бы подумал, что это ошибка в компиляторе, но это VS2010!

Ответы [ 4 ]

10 голосов
/ 16 декабря 2010

Возможно, вы скомпилировали свой код, используя расширение .c. MS Visual C не поддерживает C99. В C89 размер массива должен быть константным выражением. const квалифицированные переменные не являются константами в C. Их нельзя использовать в местах, где требуется действительная константа .

Также прочитайте этот отличный пост от AndreyT.

Попробуйте сохранить файл с расширением .cpp.

2 голосов
/ 06 августа 2015

Вы также можете использовать

int main()
{
    enum { LEN = 5 };
    int x[LEN];
}
2 голосов
/ 16 декабря 2010

Согласно http://msdn.microsoft.com/en-us/library/3ffb821x.aspx, «Значения, объявленные как const, которые инициализируются с помощью константных выражений», допустимы в границах массива, поэтому это допустимый код C ++.

Таким образом, это либо ошибка компилятора, либо что-то странное, выходящее где-то из #define. Как подсказывает комментарий sje397, попробуйте какое-нибудь имя, отличное от LEN для длины? Кроме того, это на самом деле весь ваш код, или заголовки тоже #include?

Редактировать, чтобы добавить: Кроме того, тот факт, что это действительный код C ++, конечно, не имеет значения, если вы компилируете его как C, как отмечали другие.

1 голос
/ 16 декабря 2010

потому что в этом случае я могу сделать:

int main()
{
    const int LEN = 5;
    int* LENptr = (int*)(&LEN);
    *LENptr = 10;
    int x[LEN];
}

что const означает только чтение в этом коде, а не постоянную времени компиляции

...