在Windows下用VS2008编译如下程序:
int main(int argc, char ** argv){
int length = 10;
int a[length];
return 0;
}
出现了如下错误:
error C2057: 应输入常量表达式
error C2466: 不能分配常量大小为 0 的数组
error C2133: “a”: 未知的大小
原因是C89规定数组定义时长度必须是常量。在C99中,局部数组是可以使用变量作为其长度的。但是VS2008编译器并不支持C99,所以编译会出错。
该程序在Linux下编译能通过,是因为Linux用GCC编译,而GCC支持C99。
C89 和 C99: C89是标准C(ANSI C), C99是在C89的基础上发展起来的,增加了基本数据类型,关键字和一些系统函数等。我们用的C是C89标准的,C++是C89编写的,目前支持C99比较好的是GCC,ICC次之,VC系列,包括VC2010都完全不支持C99。
GCC: (GNU Compiler Collection,GNU编译器集合)是一套由GNU工程开发的支持多种编程语言的编译器,是类Unix操作系统的标准编译器。
ICC (Intel C++ Compiler) : 美国 Intel 公司开发的 C/C++ 编译器,适用于 Linux、Microsoft Windows 和 Mac OS X 操作系统。
const int LENGTH = 10; int a[LENGTH];
上述程序在 C++编译环境下编译是能通过的,但在C语言环境下编写这段程序,编译是通不过的。因为在标准C++中,const 定义的是一个常量,而在ANSI C中,这样定义的是一个只读变量,常量应该用#define宏定义,宏定义是预编译的,在预编译阶段,LENGTH都被替换为10了。