当我在C ++中使用函数的常量参数作为数组大小时,它给出了“需要常量表达式”错误:
所以编译器没有将m
视为常量对象,这意味着我可以在函数内部更改m
的值,但是当我尝试增加m
的值时它给出了“无法修改const对象”的错误:
对我来说真的很暧昧。任何人都可以解释我的错误吗?
答案 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
。