error: variable-sized object may not be initialized
const在C,尤其是C++,是个老生常谈的问题,但这里不谈const具体有哪些特性,如何使用,而是说说const在C和C++中的区别。
编译器,C使用gcc,C++使用g++,其它编译器(cl等)请自行验证。在我的印象中,const就是常量(constant)。但这并不是真的。
在C中,const仅仅表示其所修饰对象不可修改。常量和所谓“不可修改”有什么区别呢?C中,const int N = 10; 这样的语句声明了一个整型数据,声明之后你不能再为其赋值,此即为不可修改。但在C中,N却不是常量,而诸如372, 3.72, ‘A’之类才是常量,在C中定义常量通常使用#define。而在C++中,const int N = 10; 就会定义N为常量。
怎么证明呢?你可能知道,定义静态数组,必须使用整型常量指定其大小,那咱们就用这个特性来验证上面描述的观点。
int main(int argc, char **argv)
{
const int N = 10;
int a[N] = { 1, 2, 3 };
return 0;
}
使用g++编译这个程序,没有问题。但若使用gcc,你会得到如下错误信息:
main.c: In function ‘main’:main.c:19:
error: variable-sized object may not be initializedmain.c:19: warning: excess elements in array initializer 但事情并未到此结束,如果你把上面代码中int a[N] = { 1, 2, 3 };的初始化列表去掉,即int a[N]; 然后就也能通过gcc的编译,更有甚者,如果你把const int N = 10;的const去掉:int N = 10; 也能通过gcc的编译!这是gcc所支持的特性,即动态数组。但最好不要这样做,因为gcc会为此生成大量代码。