在C ++中包装C,仅用于try / catch

时间:2009-10-13 08:53:08

标签: c++ c

所以,我有一个很大的遗留软件,用C语言编写。它适用于嵌入式系统,所以如果出现问题,比如除零,空指针取消引用等,除了重启之外没什么可做的。 / p>

我想知道我是否可以将main()实现为c ++并将其内容包装在try / catch中。这样,根据抛出的异常类型,我可以在重启之前记录一些调试信息。

嗯,因为我可能需要包装多个进程,而不仅仅是main(),但我希望你能看到我的意思......

是否值得将现有的C代码(几个100 Klocs)保持不变,除了用try / catch包装它?

7 个答案:

答案 0 :(得分:10)

除零或空指针解除引用除法不会产生异常(使用C ++术语)。 C甚至没有例外的概念。如果您使用的是类UNIX系统,则可能需要安装信号处理程序(SIGFPESIGSEGV等)。

答案 1 :(得分:4)

由于它是一个嵌入式应用程序,它可能只在一个平台上运行。

如果是这样的话,为零除以及其他硬异常安装适当的中断处理程序/内核陷阱处理程序可能会更简单,更少干扰。

在大多数情况下,只需几行代码就可以完成。检查操作系统是否支持此类可安装的异常处理程序。如果您正在使用无OS系统,则可以直接挂接在异常期间调用的CPU中断。

答案 2 :(得分:4)

首先,除以零或空指针取消引用不会抛出异常。 Fpe异常在带有信号的GNU C库中实现(SIGFPE)。并且是C99标准的一部分,而不是C ++标准。

根据我在嵌入式C和C ++开发方面的经验提供了一些提示。取决于您的嵌入式操作系统:

  • 除非你完全确定自己在做什么,否则不要尝试/捕捉线程。只在同一个线程内。每个线程通常都有自己的堆栈。
  • 在遗留的C代码中间抛出并捕获,会导致问题,因为例如当你跳出正常程序流程中的catch块时,分配的内存可能无法回收,因此你有泄漏这比在嵌入式系统中除以零或空指针取消引用更有问题。
  • 如果要使用异常,请将它们放入C ++代码中,并在构造函数中分配其他“C”资源,并在析构函数中释放。
  • 抓住它们就在C ++层之上。

答案 3 :(得分:3)

我不认为从C编译的机器代码在异常方面做同样的事情,因为为C ++编译的机器代码“知道”异常。也就是说,我不认为能够使用C ++构造从C代码中捕获“异常”是正确的。 C不会抛出异常,并且没有什么可以保证C代码执行错误时发生的错误会被C ++的异常机制捕获。

答案 4 :(得分:1)

除以零,空指针取消引用不是C或C ++异常,它们是硬件异常。

在Windows上,如果使用_set_se_translator(),您可以获得包含在普通C ++异常中的硬件异常。

__ try / __ catch也可能有所帮助。在MSDN上查找__try / __ catch,GetExceptionCode(),_ set_se_translator(),您可能会找到所需内容。

答案 5 :(得分:0)

我想我记得研究过如何处理SIGSEGV(通常在解析无效指针时生成,或除以0),我在网上发现的一般建议是:什么都不做,让程序死掉。我认为正确的解释是,当你到达一个SIGSEGV陷阱时,有问题的线程的堆栈被破坏而无法修复。

如果这是真的,有人会评论吗?

答案 6 :(得分:0)

仅适用于msvc

               
__try
{

int p = 0;
p=p / 0;
}
__except (1)
{
printf("Division by 0 \n");
}