为什么编译器认为这个变量不是常数?

时间:2010-12-16 06:14:15

标签: c++ c compiler-construction compiler-errors

这是我的代码:

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 个答案:

答案 0 :(得分:10)

您可能使用.c扩展名编译了代码。 MS Visual C不支持C99。在C89中,数组的大小必须是常量表达式。 C中的const限定变量不是常量。它们不能用于需要真正常量的地方。

另请阅读AndreyT的this excellent post

尝试使用.cpp扩展名保存文件。

答案 1 :(得分:2)

根据http://msdn.microsoft.com/en-us/library/3ffb821x.aspx,“声明为const的值使用常量表达式初始化”在数组边界中是合法的,因此这是有效的C ++代码。

因此,这可能是编译器错误,也可能是#define某处奇怪的事情。正如sje397的评论建议的那样,尝试除LEN以外的其他名称?另外,这实际上是你的整个代码,还是标题也是#include?

编辑添加:此外,如果您将其编译为C,这当然是有效的C ++代码并不重要,正如其他人所指出的那样。

答案 2 :(得分:2)

您也可以使用

C

答案 3 :(得分:1)

因为在这种情况下,我可以这样做:

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

哪个const在此代码中仅表示只读,而不是编译时常量