return语句VS在主要出口()()
-
19-08-2019 - |
题
我应该使用exit()
或return
只是main()
报表?我个人赞成return
发言,因为我觉得它像阅读其它任何功能,当我读码流控制平稳(在我看来)。而且,即使我想重构main()
功能,具有return
好像比exit()
一个更好的选择。
请问exit()
做什么特别的是return
不?
解决方案
其实,有为的差异,但它是微妙的。它有C ++更多的影响,但差异是重要的。
当我在return
打电话main()
,析构函数将被称为我的本地范围对象。如果我打电话exit()
,没有析构函数会被调用我的本地范围对象!请再读。 exit()
的不返回即可。这意味着,一旦我把它,有“无backsies。”你已经在该函数创建的任何对象不会被破坏。通常,这没有影响,但有时它确实像关闭文件(当然你希望你的所有数据刷新到磁盘?)。
请注意static
对象将被清理即使你打电话exit()
。最后注意,如果你使用abort()
,没有对象将被销毁。也就是说,没有全局对象,没有静态对象和没有本地对象将呼吁他们的析构函数。
<强>偏袒返回退出时谨慎操作。强>
http://groups.google.com/group/gnu。 gcc.help/msg/8348c50030cfd15a
其他提示
另一个区别:
exit
是一个标准库
功能,所以你需要包括
标题和链接与标准
图书馆。为了说明(在C ++),
这是一个有效的程序:
int main() { return 0; }
但使用exit
你需要一个包括:
#include <stdlib.h>
int main() { exit(EXIT_SUCCESS); }
加这增加了一个额外的假设:从主叫exit
具有main
副作用为返回零相同。正如其他人所指出的,这取决于你正在构建什么样的可执行文件(即,谁在呼叫main
)。你的编码使用的C运行的应用程序?玛雅插件? Windows服务?一个司机?每个案例都需要研究,看是否exit
相当于return
。恕我直言使用exit
当你的真的是的return
只是使代码更混乱。 OTOH,如果你的真的意味着的exit
,然后通过各种手段使用它。
有至少一个理由,更喜欢exit
:如果任何atexit
处理程序的指自动存储持续时间数据在main
,或如果使用setvbuf
或setbuf
要分配给标准流中的一个的自动存储 - 在持续时间main
缓冲液,然后从main
返回产生不确定的行为,但主叫exit
是有效的。
另一个潜在的使用情况(通常保留给玩具的方案,但是)是从与main
的递归调用的程序中退出。
return
说,它并返回main()
我总是用int
。
这是说,标准有些版本给main
特殊处理,并假设它返回0,如果没有明确的return
声明。鉴于以下代码:
int foo() {}
int main(int argc, char *argv[]) {}
G ++仅生成一个警告为foo()
并忽略从main
缺少返回:
% g++ -Wall -c foo.cc
foo.cc: In function ‘int foo()’:
foo.cc:1: warning: control reaches end of non-void function
我通过R.大约以避免在main()
自动存储该程序实际上结束之前使用回收出口()的强强>第二注释。在return X;
甲main()
语句不是精确地等效于对exit(X);
呼叫,因为main()
的动态存储消失时main()
回报,但如果到exit()
一个呼叫时,而不是它不会消失。
此外,在C或任何类似C语言return
声明,强烈暗示的读者,将继续执行在调用功能,而这延续执行,通常是技术上是真实的,如果算上C启动程序,要求您main()
功能,这不是什么的您的意思是,当你的意思是结束该进程。
毕竟,如果你想从任何其它函数中结束你的程序,除了main()
你的必须的通话exit()
。在main()
这样做一致,以及使你的代码更易读,这也使得它更容易为任何人重新因子代码;因为偶然main()
语句应已return
呼叫即从exit()
复制到一些其它功能的代码不会出现异常。
因此,结合所有这些点的共同结论是,这是一个的坏习惯的,至少在C,使用return
语句来结束main()
程序。
是否退出()做什么特别的是 '回归' 不?
通过一些编译器不常见的平台,exit()
可能同时从main()
回报可能只是直接传递价值给主机环境没有任何翻译翻译其参数为你的程序的退出值。
该标准要求在这些情况下(具体地说,它说返回东西是int
兼容从main()
应该是等效于调用exit()
具有该值)相同的行为。问题是,不同的操作系统有解释退出值不同的约定。在很多(多!)系统,0表示成功,别的是失败的。但是,比如说,VMS,奇数值意味着成功,甚至那些平均故障。如果从main()
返回0,一个VMS用户将看到一个访问冲突讨厌的消息。有不实际的访问冲突 - 这是简单地用故障代码相关联的标准报文0
然后ANSI走过来祝福EXIT_SUCCESS
和EXIT_FAILURE
,你可以传递给exit()
参数。该标准还指出,exit(0)
应相同的行为,以exit(EXIT_SUCCESS)
,所以大多数实现限定EXIT_SUCCESS
到0
。
在标准,因此,使您上VMS绑定,当其离开没有标准的方式来返回一个失败这种情况发生码具有的值为0。
90年代初期时代VAX / VMS C编译器,因此并没有解释从main()
的返回值,它只是返回的任何值到主机环境。但是,如果你使用它exit()
会做需要什么样的标准:EXIT_SUCCESS
(或0
)为成功代码和EXIT_FAILURE
转换成通用的故障代码。要使用EXIT_SUCCESS
,你的中有的通过它来exit()
,你无法从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约定退出值比奇数更细致/偶数。实际上它使用类似的低三位编码严重性级别。一般而言,然而,奇数严重性级别指示成功或杂项信息和甚至是那些指示的错误。
在C来自main
返回是完全一样调用exit
具有相同的值。
如果主函数的返回类型与INT一个类型兼容 ,<强>从到主功能的初始调用的返回相当于 调用由主的返回值exit函数 功能作为它的参数强>; 11)在到达}终止了 如果返回类型是主函数返回值0。 与诠释不兼容,终止状态返回到 主机环境是不确定的。
在其他的答案提到++是有点不同的对C的规则。
有实际exit(0)
和return(0)
main
之间的差异 - 当你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));
}
不会不管打印的争论什么。
如果你确信没有人会打电话给你的main
明确它在技术上不是一般的有很大的区别,但要保持清晰的代码exit
看起来好多了。如果出于某种原因想打电话main
- 你应该把它调整到您的需要。
谈到℃。