如何在多个函数中使用goto

时间:2017-12-06 10:01:58

标签: c

我试图在不使用exit()的情况下退出程序。我想出了一个非常复杂和肮脏的解决方案(我是初学者)。 我想使用if语句,如果是,那么我想使用goto去主函数然后return 3;并结束程序。

以下是一些代码:

    FILE *filepointer;

      char * line = NULL;
      size_t len = 0;
      size_t read;
      int linecount = 0;
      filepointer = fopen(filename, "r");
      if (filepointer == NULL)
        {
          printf("[ERR] Could not read file %s.\n",filename );
          goto FILE_ERROR;
        }
    ...
    int main(){
    ...
    FILE_ERROR: return 3;

}

但这不起作用,因为我无法在函数之间跳转,因为我将undeclared Label视为错误。我有什么方法可以从我的程序中排除exit()并仍然返回它返回某个值。如果有更好的解决方案,请告诉我

4 个答案:

答案 0 :(得分:4)

这个问题唯一的好答案是:不要做。以这种方式使用goto会使您的代码很难推理。

重构您的代码,以便您拥有清晰的结构和调用层次结构。使用返回值在整个调用堆栈中传播成功/失败。

答案 1 :(得分:2)

goto不能用于跳过不同的功能;它只能在同一个功能中使用。要在功能之间跳转,您可以查看setjmp()longjmp()功能。

话虽如此,既然你声称自己是初学者,我不相信你真的需要使用上述任何一种。您只需修改函数即可返回“错误”值。在main()中,检查其值并从main()返回错误值。

答案 2 :(得分:0)

按照设计,goto无法从一个函数跳转到另一个函数。它只能用于在给定函数内跳转。

有很多方法可以在功能之间跳转,但这样做不仅设计很差,而且很危险,因为很容易将程序置于无效状态。

处理此问题的正确方法是让函数返回特定值(或一组值)以指示错误。然后调用函数将检查其中一个错误值并采取相应的行动。

例如:

int readFile(char *filename)
{
  FILE *filepointer;

  char * line = NULL;
  size_t len = 0;
  size_t read;
  int linecount = 0;
  filepointer = fopen(filename, "r");
  if (filepointer == NULL)
    {
      // add strerror(error) to the error message to know why fopen failed
      printf("[ERR] Could not read file %s: %s.\n",filename, strerror(errno) );
      // error completion
      return 0;
    }
  ...
  // successful completion
  return 1;
}

int main(){
   ...
   if (readFile("myfile") == 0) {
       return 3;
   }
   ...
}

答案 3 :(得分:0)

如果您想使用go-to并坚持要这样做,您可以尝试扩展您的第一个函数,使其包含/封装第二个函数,并完全摆脱第二个函数,因此您可以在更大的函数中执行转到和子例程。

这是您可以尝试的选择吗? (如果您无法使用Goto,)?

我愿意。