VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 195|回复: 5

奇怪 为什么gcc运行结果和vc2013会不一样

[复制链接]
06_avatar_middle
最佳答案
0 
在线会员 发表于 2021-9-14 23:08:52 | 显示全部楼层 |阅读模式
按书上流程,在t函数中抛出异常B,t函数中中止返回f()没有找到对应catch块 然后堆栈展开返回上层继续匹配对应catch块,这里应该返回到main函数然后匹配catch(B&)这个块,但运行结果 gcc是显示catch(A&)代码,跳过catch(B&),而vs是跳过catch(A&)匹配catch(B&)块跟教程讲的一样,是谁问题?

#include <iostream>
#include <stdlib.h>
using namespace std;

class A{};
class B{};

void my_thandler(){
    cout<<"terminate called"<<endl;

}

void my1() {throw A();}
void my_uhandler2() {throw;}

void t() {throw B();}
void f() throw (A) {
    t();
    cout<<"f函数"<<endl;
}

int main(){
    set_terminate(my_thandler);
    set_unexpected(my1);
    try
    {
        f();
    }
    catch(A&)
    {
        cout<<"caught an A from f"<<endl;
    }
    catch(B&)
    {
        cout<<"忽视B类错误"<<endl;
    }

    cout<<"后续执行+++++++++++"<<endl;
    return 0;
}

第二个问题,main中catch(B&)块注解,按课本上流程抛出异常B然后返回到main函数后 找不到匹配块,c++会调用set_unexpected注册的函数my1,my1又抛出throw A(),后续没有匹配应该调用set_terminate注册函数,显示 cout<<"terminate called"<<endl;然后终止,在vc中是这样,但gcc又不一样,clang11和gcc也一样,怎么会这样?




上一篇:为什么f5调试出错,CTRL+f5运行没错误呢
下一篇:windows程序无法解析的外部命令LNK2019
07_avatar_middle
最佳答案
8 
在线会员 发表于 2021-9-15 09:39:18 | 显示全部楼层
本帖最后由 freehawkzk 于 2021-9-15 10:02 编辑

异常这块不是很熟练。
但,我感觉这代码里面有点不是很合规。
void f() throw (A)约定f()函数只抛出A类型的异常,但实际上f()抛出了一个B类型的错误,感觉有点没有遵守前面void f() throw(A)这个君子约定。
个人感觉,如果不确定f()会抛出啥,要不要试试void f() throw(...)这样?

vs在处理未匹配异常的时候好像还有点问题,在出现未匹配异常的时候,并不会自动调用set_unexpected所指定的处理函数。貌似gcc没有这个问题。

警告:MSDN中是这样说的The C++ Standard requires that unexpected is called when a function throws an exception that is not on its throw list. The current implementation does not support this. The following example calls unexpected directly, which then calls theunexpected_handler.
31_avatar_middle
最佳答案
46 
在线会员 发表于 2021-9-15 18:06:28 | 显示全部楼层
本帖最后由 cpp2019 于 2021-9-15 18:12 编辑

VS跟GCC不是一个公司的产品,两家支持的C++标准也不一样的,标准不一样就有可能导致运行结果不一样,VS2013最高支持C++11标准!

C++的异常,部分企业是不推荐使用的,在Google相关的文档就看到过,禁止使用C++异常。
06_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-9-15 21:06:07 | 显示全部楼层
freehawkzk 发表于 2021-9-15 09:39
异常这块不是很熟练。
但,我感觉这代码里面有点不是很合规。
void f() throw (A)约定f()函数只抛出A类型 ...

f()函数确实只约定抛出A类型,但B类型是通过t()函数抛出的,t函数是设定成可以抛出任何类型j。
我看教程书反而和vs一样,gcc却看不懂
06_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-9-15 21:07:32 | 显示全部楼层
cpp2019 发表于 2021-9-15 18:06
VS跟GCC不是一个公司的产品,两家支持的C++标准也不一样的,标准不一样就有可能导致运行结果不一样,VS2013 ...

我看c++pdf书籍觉的 g++运行结果不正确
31_avatar_middle
最佳答案
46 
在线会员 发表于 2021-9-15 23:50:08 | 显示全部楼层
xiethree 发表于 2021-9-15 21:07
我看c++pdf书籍觉的 g++运行结果不正确

g++ 编译时加上 -std=c++11,指定使用C++11试试。
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2021-9-27 04:57

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表