【问题标题】:Proper way to "return" from main从主要“返回”的正确方法
【发布时间】:2013-11-23 15:45:54
【问题描述】:

假设我们有程序:

int main(int argc, char** argv){
  if(argc < 3){
    printf("usage details\n");
    return EXIT_FAILURE;
  }
  dostuff();
  return EXIT_SUCCESS;
}

我也见过这个:

int main(int argc, char** argv){
  if(argc < 3){
    printf("usage details\n");
    exit(EXIT_FAILURE);
  }
  dostuff();
  exit(EXIT_SUCCESS);
}

根据ISO/IEC 9899:1989 (C90):

标准定义了 3 个严格符合的返回值(即不依赖于实现定义的行为):0 和 EXIT_SUCCESS 表示成功终止,EXIT_FAILURE 表示不成功终止。任何其他值都是非标准的和实现定义的。 main 必须在末尾有一个明确的 return 语句以避免未定义的行为。

另外,根据 ISO/IEC 9899:2011

5.1.2.2.3 程序终止

如果主函数的返回类型是与int兼容的类型,则从初始调用主函数返回相当于以主函数返回的值作为参数调用exit函数;到达终止main函数的}返回值0。如果返回类型与int不兼容,则返回宿主环境的终止状态未指定。

表示从main返回相当于调用exit,返回值相同。

话虽如此,问题是: 重要的是,您是从 main 返回并让它为您调用 exit,还是从 main 退出

【问题讨论】:

  • 是等价的。正如标准所说。即可以互换。
  • 视情况而定。您是否打算在自己的代码中自己调用 main()(可能是递归的)?如果是这样,exit() 是一个限制性选择。
  • @JohnDeters:标准还禁止调用main()
  • @duskwuff,这是 C++ 标准。 AFAIK,它在 C 中是合法的。但这仍然不是一个特别好的主意。
  • 是的,调用 main 在 C 中是合法的,但似乎不是一个好主意(尤其是如果我们定义 at_exit)

标签: c


【解决方案1】:

作为终止程序的方法,returnexit 密切相关。其实声明

return EXIT_SUCCESS;

main 中相当于

exit (EXIT_SUCCESS);  

returnexit 之间的区别在于exit 会导致程序终止,无论是哪个函数调用它。 return 语句仅在出现在 main 函数中时才会导致程序终止。

【讨论】:

  • 另一个区别是exit可以用在a == 1 ? do_stuff() : exit(EXIT_FAILURE);这样的结构中,而return不能
猜你喜欢
  • 2022-01-23
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2012-08-07
  • 2015-05-31
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多