在类中使用_matherr?

timepalette 2004-02-01 09:57:03
我有一个CExp类,在实现文件中:
#include <math.h>

...
int _matherr(struct _exception * except)
{
gbMathErr = TRUE;
AfxMessageBox("aaa");
return 1;
}

CExp::CExp()
{
double y = log(-2.0); // 没反应,执行不到_matherr
}

但是我想捕获浮点错误,而不是"keep silent."
请问该怎么办呀。
...全文
87 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ross33123 2004-02-03
  • 打赏
  • 举报
回复
比较奇怪

我的程序是可以进入 _matherr 的

你的 MSVCRTD.DLL 是什么版本?

我的是 6.00.8797.0
timepalette 2004-02-02
  • 打赏
  • 举报
回复
1025060C cmp dword ptr [__matherr_flag (1025f0d8)],0
10250613 jne __87except+144h (10250624)
10250615 mov ecx,dword ptr [ebp+0Ch]
10250618 push ecx
10250619 call __matherr (1020a130)
1025061E add esp,4
10250621 mov dword ptr [ebp-8],eax
10250624 cmp dword ptr [ebp-8],0
到第二行就直接跳了,不知道__matherr_flag是通过什么改变的。
栈结构:
MSVCRTD! _87except + 324 bytes
MSVCRTD! _startOneArgErrorHandling + 41 bytes
MSVCRTD! log + 182 bytes
ross33123 2004-02-02
  • 打赏
  • 举报
回复
跟踪了一下

如果优化选项为 max speed

double y = log(-2.0);

生成的代码是直接用浮点指令

把函数调用优化掉了

如果优化选项为 min size

生成的代码有函数调用
ross33123 2004-02-02
  • 打赏
  • 举报
回复
另外还要注意优化选项

像你的
CExp::CExp()
{
double y = log(-2.0); // 没反应,执行不到_matherr
}

做成 Release 版会把 double y = log(-2.0); 优化掉

当然就不会进入 _matherr 了
timepalette 2004-02-02
  • 打赏
  • 举报
回复
就是这样的啊,可还是不行,谁能帮我试试
ross33123 2004-02-01
  • 打赏
  • 举报
回复
不但要有 extern "C"

而且你的程序必须是动态连接到 msvcrt(d).dll

你可以设置 Project Settings / C/C++ / Code Generation / Use run-time lib / "Debug multithreaded DLL"
无我无人 2004-02-01
  • 打赏
  • 举报
回复
要用 try-catch block 才能捕获异常啊!

void SomeFunc()
{
CPerson* myPerson = new CPerson;

try
{
// Do something that might throw an exception.
myPerson->SomeFunc();
}
catch( CException* e )
{
// Handle the exception locally
e->Delete();
}

// Now destroy the object before exiting.
delete myPerson;
}

in MSDN, search "Exception Handling (MFC)" exactly in title only.
timepalette 2004-02-01
  • 打赏
  • 举报
回复
在_matherr前加extern "C"也无济于事

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧