zoukankan      html  css  js  c++  java
  • 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 却是在后面所有作用域都有效,所以就出现了重复定义问题。

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

  • 相关阅读:
    教你写Makefile(很全,含有工作经验的)
    configure.in详解
    使用autoconf与automake自动生成MakeFile文件
    例解 autoconf 和 automake 生成 Makefile 文件
    MYSQL:SQL中Group By的使用
    日志文件系统syslog,syslog-ng
    syslog-ng应用详解
    sublime的lua插件
    MySQL索引类型
    linux下automake用法
  • 原文地址:https://www.cnblogs.com/PegasusWang/p/3057169.html
Copyright © 2011-2022 走看看