代码之家  ›  专栏  ›  技术社区  ›  Srikanth

main()中的return语句vs exit()

  •  178
  • Srikanth  · 技术社区  · 16 年前

    我应该用吗 exit() return 声明 main() ? 就我个人而言,我赞成 回来 语句,因为我觉得这就像阅读任何其他函数一样,并且在阅读代码时流控制是平滑的(在我看来)。即使我想重构 回来 看起来是个更好的选择 退出()

    退出() 有什么特别的事吗 不?

    6 回复  |  直到 9 年前
        1
  •  293
  •   FreeMemory    16 年前

    有区别,但很微妙。它对C++有更多的含义,但差异是很重要的。

    当我打电话时 return main() ,将为本地作用域对象调用析构函数。如果我打电话 exit() 不会为我的本地作用域对象调用析构函数! 重读一遍。 退出() 不回来 . 这意味着一旦我调用它,就不会有“倒退”。在该函数中创建的任何对象都不会被销毁。这通常没有任何影响,但有时会有影响,比如关闭文件(当然您希望将所有数据刷新到磁盘?)。

    注意 static 即使您调用,对象也将被清除 . 最后请注意,如果您使用 abort() ,则不会销毁任何物品。也就是说,没有全局对象、静态对象和局部对象将调用其析构函数。

    当倾向于退出而非返回时,请小心操作。

    http://groups.google.com/group/gnu.gcc.help/msg/8348c50030cfd15a

        2
  •  26
  •   jwfearn    10 年前

    另一个区别是: exit 这是一个标准的图书馆 图书馆为了说明(用C++),请, 这是一个有效的程序:

    int main() { return 0; }
    

    出口 您将需要包括:

    #include <stdlib.h>
    int main() { exit(EXIT_SUCCESS); }
    

    另外,这增加了一个额外的假设:调用 出口 从…起 main 与返回零有相同的副作用。正如其他人所指出的,这取决于您正在构建什么类型的可执行文件(即,谁在调用 ).您是否正在编写使用C运行时的应用程序?Maya插件?Windows服务?司机?每个案例都需要研究以确定 出口 return . IMHO使用 出口 回来 出口 ,然后尽一切办法使用它。

        3
  •  17
  •   R.. GitHub STOP HELPING ICE    14 年前

    至少有一个理由可以选择 exit :如果你有 atexit 处理程序引用中的自动存储持续时间数据 main setvbuf setbuf 将自动存储持续时间缓冲区分配给其中一个标准流 主要的 ,然后从 产生未定义的行为,但调用 出口 这是有效的。

    主要的 .

        4
  •  5
  •   Alnitak    16 年前

    我总是用 return 因为标准的原型 main() 表示它确实返回一个 int

    也就是说,一些版本的标准给出了 main 特殊处理,并假设如果没有显式 回来 陈述给定以下代码:

    int foo() {}
    int main(int argc, char *argv[]) {}
    

    G++仅为以下对象生成警告: foo() 主要的

    % g++ -Wall -c foo.cc
    foo.cc: In function ‘int foo()’:
    foo.cc:1: warning: control reaches end of non-void function
    
        5
  •  5
  •   Greg A. Woods    13 年前

    强烈地 其次是R.关于使用exit()以避免在中自动存储的注释 main() 在程序实际结束前回收。A. return X; main() 并不完全等同于对 exit(X); ,因为 消失时 main() 返回,但如果调用 exit()

    此外,在C或任何类似C的语言中 return 语句强烈地提示读者,执行将在调用函数中继续,而如果您计算调用 main() 当你打算结束这个过程的时候。

    毕竟,如果您想从任何其他函数中结束程序,除了 main() 必须 退出() main() 这也使得你的代码更具可读性,也使得任何人都更容易重新考虑你的代码;i、 e.从中复制的代码 对其他一些功能不会因为意外而行为不端 声明 应该 退出() 电话。

    所以,把所有这些观点结合起来,结论是这是一个 坏习惯 回来 语句以结束中的程序 main() .

        6
  •  5
  •   Adrian McCarthy    9 年前

    exit() 可能会将其参数转换为程序的退出值,而 main() 可能只是将值直接传递给宿主环境,而不进行任何转换。

    该标准要求在这些情况下有相同的行为(特别是,它说返回的是 int main() 应该相当于打电话 具有该值)。问题是不同的操作系统在解释退出值时有不同的约定。在很多(很多!)系统上,0意味着成功,其他任何东西都是失败的。但在虚拟机上,奇数值意味着成功,偶数值意味着失败。如果您从返回0 main() ,VMS用户将看到一条关于访问冲突的恶意消息。实际上没有访问冲突——这只是与故障代码0关联的标准消息。

    EXIT_SUCCESS EXIT_FAILURE 作为您可以传递给的参数 退出() exit(0) 行为应与 exit(EXIT_SUCCESS) ,因此大多数实现定义 退出成功 0 .

    因此,该标准使您在虚拟机上处于绑定状态,因为它没有返回 失败 恰好值为0的代码。

    因此,20世纪90年代早期的VAX/VMS C编译器没有解释 main() 它可以做标准要求的事情:翻译 退出成功 (或 )转化为成功代码和 转换为通用故障代码。使用 退出成功 传给 ,您无法从 main() . 我不知道更现代版本的编译器是否保留了这种行为。

    一个可移植的C程序,看起来像这样:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
      printf("Hello, World!\n");
      exit(EXIT_SUCCESS);  /* to get good return value to OS */
      /*NOTREACHED*/ /* to silence lint warning */
      return 0;  /* to silence compiler warning */
    }
    

    旁白:如果我没记错的话,VMS退出值的约定比奇数/偶数更细微。它实际上使用低三位之类的东西来编码严重性级别。但是,一般来说,奇数严重性级别表示成功或杂项信息,偶数严重性级别表示错误。

        7
  •  0
  •   dbush    6 年前

    在C中,从 main 和打电话完全一样 exit 具有相同的值。

    C standard 国家:

    , 从初始调用到主函数的返回相当于 函数作为它的参数 main函数返回一个值0。如果返回类型为 与int不兼容,终止状态返回到 主机环境未指定。

    C++的规则与其他答案中的不同。

        8
  •  -1
  •   radrow    6 年前

    两者之间实际上是有区别的 exit(0) return(0) 在里面 main 当您的 主要的 函数被多次调用。

    以下程序

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char** argv) {
      if (argc == 0)
        return(0);
      printf("%d", main(argc - 1, argv));
    }
    

    作为

    ./program 0 0 0 0
    

    将产生以下输出:

    00000
    

    然而,这一点:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char** argv) {
      if (argc == 0)
        exit(0);
      printf("%d", main(argc - 1, argv));
    }
    

    无论参数如何,都不会打印任何内容。

    如果你确信没有人会打电话给你 主要的 明确地说,一般来说,这在技术上不是一个很大的区别,而是为了维护更清晰的代码 exit 看起来好多了。如果你出于某种原因想打电话 主要的 -您应该根据自己的需要进行调整。