[C] 关于goto的想法

goto似乎一直都不推荐使用,但是我在处理动态内存申请时候,感觉不用goto挺难维护代码。比如在一个函数有多个出口的时候,函数内有动态内存申请,那么退出的时候必然要去free,但如果每个return之前都要写free,这样在修改的时候很复杂。

void func()
{
  malloc();
  for	(..)
  {
    if (..)
    {
      free(...);
      return;
    }
    if (..)
    {
      free(...);
      return;
    }
  }
  free(...)
  return;
}

如果使用Goto的话,所有的动态内存释放都放在一个地方管理,而且代码似乎更加简洁了。不过C++就不需要考虑这个问题了。

void func()
{
  malloc();
  for	(..)
  {
    if (..)
    {
      goto CLEAR;
    }
    if (..)
    {
      goto CLEAR;
    }
  }
  
CLEAR:
  free(...);
  return;
}

网上还有一些关于Goto的应用比如:
Ragel State Machine Compiler 有限状态机编译器,可以直接转混成C和C++源码

C里面还有setjmp和longjmp来完成goto的操作。

#include <stdio.h>
#include <setjmp.h>
int main()
{
  jmp_buf env;
  int ret = 0;
  ret = setjmp(env);
  printf("ret=%d\n", ret);
  if (ret == 0)
    longjmp(env, 1);
  if (ret == 1)
    longjmp(env, 2);
  return 0;
}
//	output:
//	ret = 0
//	ret = 1
//	ret = 2

发表评论

电子邮件地址不会被公开。 必填项已用*标注