zoukankan      html  css  js  c++  java
  • GCC4.2.1与VC6.0编译器容错性小对比

    虽然才用Linux不久,但我现在写写小程序的时候已经习惯了GCC+GDB+vim的模式,说实在的我目前也只是照着网上那些爱好者们的说法来做,他们说怎样好,我就试着去学习怎样的模式,我知道这样太盲目,可是也没有更好的办法去选择,除了在网上找找信息外,遇见什么问题身边连个讨论的人都没有。无奈,希望能早点看到Linux普及的那天--会有那么一天么?我心里没底。
    学校安排的上机还都是在VC6.0的环境下,以前在那里写程序的时候也没啥感觉,可把我在GCC4.2.1编译通过的程序拿到VC6.0下狂报错误的时候,我意识到了一些不同……
    只是从一两个小程序里得出的几点简单的体会,也还是分点说说吧,以后再补充。

    第一,有关头文件。
    比如说我想用string数据类型并调用一些相关的函数进行操作,在GCC4.2.1下不用包含string头文件就可以随意使用sting类和它的成员函数,但我把同样的程序移到VC6.0下去编译的时候,就出了几个错误,其中最主要的就是头文件包含问题,除了要包含string类外,有些函数调用还要用到algorithm头文件。我想,按标准来讲肯定也不是就能够不包含,只不过是容错性良好的GCC帮我自动加上了吧。

    第二,有关函数返回类型。
    这点估计是最常见的问题了吧,我这类菜鸟在VC6.0下比较常见的写法是void main(),在GCC下常见的写法是int main(),很显然这移到对面去编译是都不能通过的,但让我奇怪的是在很多情况下在VC6.0里我用int返回类型,在最后加上return 0;也不行,这点一直想不通。

    第三,有关初始化问题。
    比如我想定义所有元素都为0一个数组,在VC6.0下,如果把数组定义在函数体内部,我必须用const常量或数值常量显式地指明数组的长度,并指定一些元素的值为0才行,如果想其自动初始化,那必须将数组定义为全局。而GCC下则要随便得多,我可以用一个调用时才知道值的变量来指定数组的长度,可以在函数体内部定义未初始化的数组,这些编译并且运行的时候都不会出任何问题。

    第四,有关重定义的容错
    举个简单的例子吧:
    for(int i=0;i!=x;++i) ......;
    ..........;
    for(int i=0;i!=6;++6) ......;
    ..........;
    很明显,这里的变量名i被重定义了。可以令我惊奇的是在GCC下居然编译运行一点问题都没有,而在VC6.0下一编译就报错。

    有很多爱好Linux的朋友们老在批评VC对标准C++的支持是多么的滥,这点我目前还没有体会到,也许以后学深一点会感觉到。但是从以上这几点来说我感觉其实VC也不错,至少它很严谨,对初学者按标准语法的用法的良好习惯养成是很有益的。GCC是很强大,我见识到了它的容错性也很强大,可是目前我却有点犹豫了,在它强大的容错性下,有很多错误的用法不会被报出来,我也就永远不知道自己错了,我指不定就会养成多少的坏习惯。我会继续GCC下去,可是对写的每个程序,我要重新解读,不要被本是为方便程序员的容错功能给纵容了……
  • 相关阅读:
    Oracle SQL语句大全—查看表空间
    Class to disable copy and assign constructor
    在moss上自己总结了点小经验。。高手可以飘过 转贴
    在MOSS中直接嵌入ASP.NET Page zt
    Project Web Access 2007自定义FORM验证登录实现 zt
    SharePoint Portal Server 2003 中的单一登录 zt
    vs2008 开发 MOSS 顺序工作流
    VS2008开发MOSS工作流几个需要注意的地方
    向MOSS页面中添加服务器端代码的另外一种方式 zt
    状态机工作流的 SpecialPermissions
  • 原文地址:https://www.cnblogs.com/mazhuang/p/1641694.html
Copyright © 2011-2022 走看看