C转到不同的功能

时间:2012-12-03 09:21:40

标签: c embedded goto

我正在使用一个似乎不存在exit()调用的嵌入式系统。

我有一个调用malloc的函数,而不是让程序在失败时崩溃我宁愿退出一点优雅。

我最初的想法是使用goto但是标签的范围似乎非常有限(我不确定,我从来没有使用过它们“从不使用GOTO !! 1 !!”)。

我想知道是否可以转到另一个函数的一部分,或者是否有任何其他创造性的方法从任意函数退出C程序。

void main() {
  //stuff
  a();

  exit:
     return;
}

void a() {
   //stuff

   //if malloc failed
   goto exit;
}

感谢您的帮助。

4 个答案:

答案 0 :(得分:9)

选项:

  • 由于您的系统是非标准的(或者可能是标准的但非托管的),请查看其文档以了解如何退出。
  • 尝试abort()(警告:这不会调用atexit处理程序)。
  • 检查您的系统是否允许您向自己发送会自杀的信号。
  • 返回a()指示错误的值,并通过错误传播,一直返回main
  • 检查您的系统是否有setjmp/longjmp。这些很难正确使用,但它们确实提供了你所要求的:从程序中的任何地方传输执行的能力(不一定包括信号/中断处理程序,但你可能不会调用malloc无论如何)到main函数中的特定点。
  • 如果您的嵌入式系统是您的程序是唯一运行在其上的代码,那么您可以调用一些进入错误状态的代码而不是退出:可能是无限循环,可能会闪烁LED或以其他方式指示那个坏事已经发生了。也许你可以引发重启。

答案 1 :(得分:3)

为什么不使用返回值

if malloc failed
  return 1;
else 
  return 0;


...........

if(!a())
   return;

答案 2 :(得分:2)

goto不可能跳转到另一个函数。

通常情况下,建议您请不要使用goto!在这种情况下,您无法提出要求。

如何处理?解决方案很少。

  • 检查有问题的功能的返回代码或值,并采取相应的行动。

  • 使用setjmp / longjmp。这个建议应该被认为比使用goto本身更加邪恶,但它确实支持从一个函数跳转到另一个函数。

答案 3 :(得分:2)

嵌入式系统很少有exit()的变体,因为该函数在给定的上下文中不一定有意义。电梯或烤面包机的控制器从哪里出来?

在多任务嵌入式系统中,可能会有一个系统调用来退出或终止进程,只留下一个空闲进程,它只是一个繁忙的循环:while (1);或者在某些情况下调用特权指令来上电保存模式:while (1) { asm("halt") };

在嵌入式系统中,从错误中“恢复”的一种可能方法是asm("trap #0");或任何等效的调用中断向量,通过将内核转储到闪存驱动器或向UART输出错误代码来实现正常的系统关闭。