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下去,可是对写的每个程序,我要重新解读,不要被本是为方便程序员的容错功能给纵容了……
学校安排的上机还都是在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下去,可是对写的每个程序,我要重新解读,不要被本是为方便程序员的容错功能给纵容了……
更多原创技术内容,可以通过公众号「闷骚的程序员」订阅: