VC6.0编译器不符合标准的一些情况(解决一些编译错误)

都什么时代了,老谭的书还用VC6.0, 编译器那么老(好像是c89之前了,比较新的是c99标准)对标准支持不好,真是阻碍中国计算机教育的进步。

最近几个编译器来回换,蓝桥杯好像只给vc6.0,发现还是g++的编译器比较好,编译出的代码执行速度更快一点,对标准支持的最好。

看这一段很简单的代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 int main()
 5 {
 6     int n;
 7     cin >> n;
 8     int a[n];
 9     int b[n];
10     for (int i = 0; i < n; ++i)
11         cin >> a[i];
12     for (int i = 0; i < n; ++i)
13         cin >> b[i];
14     return 0;
15 }

用g++完全没问题,没有任何waring或者error,但是用vc6.0的话就会一堆错误:

t.cpp(8) : error C2057: expected constant expression
t.cpp(8) : error C2466: cannot allocate an array of constant size 0
t.cpp(8) : error C2133: 'a' : unknown size
t.cpp(9) : error C2057: expected constant expression
t.cpp(9) : error C2466: cannot allocate an array of constant size 0
t.cpp(9) : error C2133: 'b' : unknown size
t.cpp(12) : error C2374: 'i' : redefinition; multiple initialization
t.cpp(10) : see declaration of 'i'

纠结了一阵终于明白了,首先vc6.0中(即使较新的vc++2010)也不允许定义变长数组,但是c99标准已经支持变长数组,所以可以用a[n]直接创建变长数组,下标可以是变量。c99规定,变长数组必须是自动存储类。(变长数组中的”变"意思是说其维数可以用变量指定,而不是说创建数组后可以修改其大小)

另外一点就是vc6.0中在for语句中创建的变量 i 的作用域问题,c99规定for语句中的 i 只在该for 语句中有效,但是vc6.0中for语句中的 i 却是在后面所有作用域都有效,所以就出现了重复定义问题。

知道了原因,修改编译错误就是小菜了。当然还有其他一些不合标准的地方,反正不用这玩意了。还是建议用最新的编译器,逐渐淘汰不符合标准的。

原文地址:https://www.cnblogs.com/PegasusWang/p/3057169.html