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

问题描述 投票:0回答:4

这是我的代码:

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!

c++ c compiler-errors
4个回答
11
投票

您可能已经使用 .c 扩展名编译了代码。 MS Visual C 不支持 C99。在 C89 中,数组的大小必须是常量表达式。

const
限定变量不是C中的常量。它们不能用在需要实数常量的地方。

另请阅读 AndreyT 的这篇优秀的文章

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


3
投票

你也可以使用

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

2
投票

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

因此,这要么是编译器错误,要么是#define 某处出现的奇怪情况。 正如 sje397 的评论所建议的,尝试使用

LEN
以外的其他名称来获取长度? 另外,这实际上是您的整个代码,还是标头也被#included?

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


1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.