在我的VS2010副本中,stdlib.h包含(第353-355行)
_CRTIMP __declspec(noreturn) void __cdecl exit(_In_ int _Code);
_CRTIMP __declspec(noreturn) void __cdecl _exit(_In_ int _Code);
_CRTIMP void __cdecl abort(void);
我觉得奇怪的是noreturn
上没有abort()
注释。有谁知道这个的原因?这是一个错误吗?
编辑:在VS2008中,它是相同的,但是stdlib.h的第371-373行
缺少noreturn
注释会触发error C4716。
进一步参考:C++0x proposal for standardization of the noreturn
annotation,其中abort
应该随身携带。
编辑:看起来一堆讨论因删除的答案而消失,但其中的要点包含在Defect Report #048中。
答案 0 :(得分:6)
我认为这绝对是错误的,因为无论std强制执行什么,Visual Studio附带的abort()实现都不会从abort返回。你不能在SIGABRT的信号处理程序中做任何事情,这会阻止在Visual Studio的abort()实现结束时调用_exit(3)(我正在查看文件中的abort.c,第137行) VS 2005)。
因为__declspec(noreturn)是一个实现的东西,因为在Visual Studio中实现abort永远不会正常返回,所以abort()应该用__declspec(noreturn)标记。
因此,缺席是一个错误。
报告此错误