为什么用作数组大小的函数的常量参数会产生错误?

时间:2012-01-29 07:17:47

标签: c++ arrays function

当我在C ++中使用函数的常量参数作为数组大小时,它给出了“需要常量表达式”错误:
enter image description here

所以编译器没有将m视为常量对象,这意味着我可以在函数内部更改m的值,但是当我尝试增加m的值时它给出了“无法修改const对象”的错误:
enter image description here

对我来说真的很暧昧。任何人都可以解释我的错误吗?

4 个答案:

答案 0 :(得分:5)

const实际上并不意味着“此值是常数”,但是,“您无法更改此值。”

有了这个,应该清楚为什么后面的代码无法编译,但前者不能。即使你给它一个默认的5,它也不会保证它是五,所以你没有一个常量,所以你不能创建一个数组。但类型仍为const,因此您无法更改它。

那就是说,因为C99你可以拥有可变长度数组,所以这实际上很好。 (在C ++中它是不行的。)你的编译器似乎太旧了,无法支持C99。 (我强烈建议使用最新的GCC。)

答案 1 :(得分:4)

您无法静态创建可变大小的数组。这就是malloc()的用途。编译器将常量视为变量,即使它们被声明为const,因为它在编译时对它们一无所知,因此它不能生成编译时代码来创建静态数组。

此外:如果您将m声明为const int m=5,那么为什么地球上你希望它能够增加?它是一个常数,所以你不可能修改它的值。

这里没有什么是暧昧的,你只需要考虑一下。

答案 2 :(得分:2)

CodeBlocks是一个编辑器/ IDE,而不是编译器。我假设它使用GCC作为编译器,我认为它有一个扩展,可以在C ++中使用C99的可变长度数组。

这在C ++ 11中甚至都没有(并且可能永远不会在C ++中,因为我们有std::vector),所以这是20年前编译器实际上正确的少数情况之一。

如果我是你,我仍然会转储TC ++。它属于博物馆。

答案 3 :(得分:0)

您需要编译时常量积分表达式。不只是const