当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

<b>用C++非常代替exit()函数</b>[VC/C++编程]

赞助商链接



  本文“<b>用C++非常代替exit()函数</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

从C语言开始接触C++的人,恐怕都知道exit()这个函数,仿佛目前很多的程序员都有这样一种习惯,在程序一碰到错误、或任务刚完成时,把调用exit()函数当作是一种最好的完毕程序的办法.在从前遗留的很多老式C/C++代码中,这种现象非常广泛,但当手头的软件项目渐渐进展并越来越大时,就不得不面对归并从前分离的各个模块这项工作,此时,假如还有人记得起软件日记记录、错误宽大度、或至少得当的清理工作,就已经是万幸了.本文中要说的办法,决不是一条计划原则,但是可减轻改正那些未杰出计划及实现的老式代码时所带来的痛楚.

用return来代替exit,无疑是办理此问题最显而易见的办法,假如软件项目非常简单,这也是最高效的办理筹划;但是,项目中常常有成打的函数分布在多个源文件中,且这些函数的调用也嵌套在很深的层次中,那么,事情就变得棘手了.假如在这种情形中,全部的函数都返回void,还是有大概改正它们,让其返回一个退出码(exit code)的,但所付出的代价也很大;假如函数已经能返回一个有意义的值,只是在碰到错误时,调用了exit(),那么这项工作会变得更损耗时间,也会越发简单出错.这里说点题外话,利用exit()也是有可取之处的,当老式代码没有计划返回任何东西时,假如想得到返回码(return code),只有靠exit()了.

有关此问题,还是有一个办理办法的,在这种情形下,我们假定全部的源代码已经为C++格局,或无需全部编译便可以移植为C++格局,把全部exit呈现的地方全部换成throw(这可以自动完成,乃至无须理解老代码是怎样工作的);接着,在任何得当的地方,捕捉为整数的非常码,这种办法还可根据严重性或恢复程度的差别,在差别层面上处理错误.

请看以下示例,原始代码以下:

// main.cpp
void main() {
 //初始化
 ...
 ProcessMail(...);
}
//另一个源文件
void ProcessMail(...) {
 //初始化
 ...
 if ( initializationError ) {
  printf("faild to init!!!
");
  exit(-1);
 }
 while ( !shutdown ) {
  ReadMail(...)
  //持续处理
  ...
 }
}
void ReadMail(...)
{
 ...
 //对ReadBytes()的调用呈目前函数内的多处地方,包含在循环中.
 nBytesAvailable = ReadBytes(...)
 ...
}
//另一个源文件
int ReadBytes(...)
{
 //读取数据
 ...
 if ( error ) {
  printf("there was an error!!
");
  exit(-1);
 }
 return nBytesRead;
}
  在原始代码中贫乏恢复或日记记录的功效,假如发生了一个错误,程序就会"消逝"不见了,让用户不知所措.下面是重新组织后的代码,注意,没有改正函数修饰符:

void main() {
 //初始化
 ...
 try {
  ProcessMail(...);
 } catch (int ret) {
  switch (ret) {
   case E_INITIALIZATION_FAILURE: ...
   case E_IRRECOVERABLE: ...
   ...
  }
 }
}
void ProcessMail(...) {
 //初始化
 ...
 if ( initializationError ) {
  throw(E_INITIALIZATION_FAILURE);
 }
 while ( !shutdown ) {
  try {
   ReadMail(...)
  } catch (int ret) {
   switch (ret) {
    case E_READ_ERROR:
     //记录错误信息
     ...
     //试图恢复
     ...
     if ( recovered ) {
      continue;
     } else {
      throw(E_IRRECOVERABLE);
     }
     break;
    case ...
   }
  }
  //持续处理
  ...
 }
 //throw()可以用来代替贫乏的返回码
 //但也要注意由此带来的性能丧失
 throw(S_OK);
} // ProcessMail()
void ReadMail(...)
{
 ...
 //在此无须捕捉非常
 nBytesAvailable = ReadBytes(...)
 ...
}
int ReadBytes(...)
{
 //读取数据
 if ( error ) {
  throw(E_READ_ERROR);
 }
 return nBytesRead;
}
  目前,改正从前遗留的老式项目时,是不是多点信心了呢?


  以上是“<b>用C++非常代替exit()函数</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .