Chinaunix

标题: gcc是否为我们做的太多 [打印本页]

作者: wzlxx_    时间: 2010-06-07 18:18
标题: gcc是否为我们做的太多
昨天因为一时的疏忽在写一个代码的时候少写了拷贝构造函数,结果在GCC上运行一切正常,然后到了VC6.0上悲剧就来了。所有返回对象的的函数都有了问题。。。让我汗呢 然后我就想是不是因为GCC为我们做的太多了,这样好吗?这样会不会让我们太依赖它,如果我们要用到其他编译器了怎么办?请大家说说自己的看法
作者: xinglp    时间: 2010-06-07 18:22
我这一般是VC cl编译的运行正常,gcc就挂了
作者: wzlxx_    时间: 2010-06-07 18:26
回复 2# xinglp


    少了拷贝构造函数我在G++下用了-Wall 还是没有错误(因为是GCC编译过的,我把所有的经历都放在了以为就VC的BUG上了,结果。。。。最好才发现的这个地方),感觉在平时越是“苛刻”的编译器越好,好让我们有一个好的习惯
作者: 没本    时间: 2010-06-07 18:26
就是因为编译器的各种差异性,所以Google才会弄个内部的C++编程规范。
作者: wzlxx_    时间: 2010-06-07 18:29
回复 4# 没本


    嗯,就是天天在GCC下太舒服了,等到了让我必须用VC6的时候就出事了,规范太重要了。。。。
作者: xinglp    时间: 2010-06-07 18:33
回复 3# wzlxx_


   gcc 4.5 么?
作者: wzlxx_    时间: 2010-06-07 18:34
回复 6# xinglp


    gcc (GCC) 4.5.0 20100520 (prerelease)
作者: xinglp    时间: 2010-06-07 19:20
回复 7# wzlxx_


   竟然没有警告
作者: wzlxx_    时间: 2010-06-07 19:50
不但没有警告而且运行没事,哈哈哈哈,GCC太智能了。回复 8# xinglp
作者: rain_fish    时间: 2010-06-07 20:34
按套路来就好了
作者: mgqw    时间: 2010-06-07 21:18
拷贝构造函数?
那是g++吧。
作者: OwnWaterloo    时间: 2010-06-07 21:57
不但没有警告而且运行没事,哈哈哈哈,GCC太智能了。回复  xinglp
wzlxx_ 发表于 2010-06-07 19:50


我猜不是gcc智能的原因。
gcc应该生成的是和vc6差不多的代码, 即生成的复制构造仅仅是member-wise拷贝。依然会导致多次free的行为
lz可以做个实验看看, 分析问题究竟是:gcc太智能, 没有产生多重free的行为;还是glibc太溺爱, 即使多重free也没有立即崩溃。
作者: 变异老鼠    时间: 2010-06-07 21:59
我倒是没看出来一个类没有拷贝构造函数在编译期究竟应该出什么问题。

难道你还要编译器这么说——警告:XXX 类没有拷贝构造函数?
作者: wzlxx_    时间: 2010-06-07 22:17
回复 12# OwnWaterloo


    我就是忘记了这一点才弄看了半天代码没有发现呢,G++编译过的可执行文件似乎没有多次free,程序运行的很正常,不过潜在的问题我不知道。不过同样的代码在VC6.0根本无法执行
作者: wzlxx_    时间: 2010-06-07 22:20
回复 13# 变异老鼠

不是说编译器会提示,因为这个是运行时错误,但是在VC6.0下生成的执行文件无法运行,因为多次free造成了很多数据无法访问,但在linux下生成的暂时没有发现问题
作者: prolj    时间: 2010-06-08 09:25
你去用VC2.x去吧。
作者: 群雄逐鹿中原    时间: 2010-06-08 09:37
vc6再不济,gcc和vc这点上的行为也应该是一样的。
作者: beyond_touch    时间: 2010-06-08 10:24
By default, class objects can be copied. In particular, a class object can be initialized with a copy of another object of the same class. This can be done even where constructors have been declared.

By default, the copy of a class object is a copy of each member. If that default is not the behavior wanted for a class X, a more appropriate behavior can be provided by defining a copy constructor, X::X(const X&).


By Bjarne Stroustrup

If the class definition does not explicitly declare a copy constructor and there is no user-declared move
constructor, a copy constructor is implicitly declared as defaulted (8.4). Thus, for the class definition
struct X { X(const X&, int);
};
a copy constructor is implicitly-declared. If the user-declared constructor is later defined as
X::X(const X& x, int i =0) { /∗ ... ∗/ }
then any use of X’s copy constructor is ill-formed because of the ambiguity; no diagnostic is required.

12.8        Copying and moving class objects, Programming Languages — C++, ISO/IEC JTC1 SC22 WG21 N 3092

作者: benjiam    时间: 2010-06-08 11:29
这个gcc vc 都没关系吧

本来就是默认的复制构造函数


应该是glibc 好 没让你马上挂。  我这里有个bug 开发机从来不挂 测试机 直接挂
作者: EricFisher    时间: 2010-06-08 11:32
我们为gcc做得太少
作者: mirnshi    时间: 2010-06-08 11:53

作者: wzlxx_    时间: 2010-06-08 12:07
这个gcc vc 都没关系吧

本来就是默认的复制构造函数


应该是glibc 好 没让你马上挂。  我这里有个bu ...
benjiam 发表于 2010-06-08 11:29

说的对
作者: alienauron    时间: 2010-06-09 13:20
本帖最后由 alienauron 于 2010-06-09 13:25 编辑
beyond_touch 发表于 2010-06-08 10:24



    这乃正解,和GCC,VC,LZ都有关。
C++语言规范里明确说明了:如果没有显式定义copy constructor,语言要求有默认的copy constructor生成,这个工作应该由编译器完成。可以参考C++的教程或者C++语言规范ISO/IEC JTC1 SC22 WG21 N3092 12.8 第8款。
GCC的C++实现基本cover了C++语言规范的,做了自己应该做的事情,并没有多做什么
VC 6 toooooold了,对C++规范的支持很不好,个人觉得不适合用来编C++。
另外,LZ还是忽略了编译器会自动完成的一些东西,在使用C++的时候,一定要小心。个人感觉在实现C++类的时候,得养成把构造函数,拷贝构造函数之类会被编译器自动生成的东西首先按照需求完成,如果不能拷贝的,一定要显式止之类的,然后再实现其他的部分。
作者: wxfjx    时间: 2010-06-09 13:23
很多情况是VC的代码在gcc下不能通过




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2