2010-12-16 2 views
3

Это мой код:Почему компилятор считает, что эта переменная не является постоянной?

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!

+3

проверить, что LEN не был #defined где-то? – sje397 2010-12-16 06:15:46

+0

Мой вопрос: почему вы не используете `# define` для этого? – William 2010-12-16 06:15:58

+4

Вы компилируете C или C++? – 2010-12-16 06:18:26

ответ

10

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

Также читайте this excellent post от AndreyT.

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

2

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

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

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

1

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

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

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

2

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

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