在我的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);
我觉得奇怪的是abort()
上没有noreturn
注解。有人知道这是什么原因吗?这是个bug吗?
编辑:在VS2008中是一样的,但stdlib.h的第371-373行
缺少noreturn
注释将触发error C4716。
进一步的参考:C++0x proposal for standardization of the noreturn
annotation,它说abort
应该携带它。
编辑:看起来像一堆讨论消失了一个删除的答案,但它的要点在Defect Report #048中涵盖。
发布于 2010-08-27 21:03:00
我认为这绝对是错误的,因为无论std要求什么,Visual Studio附带的abort()实现将永远不会从abort返回。您不能在SIGABRT的信号处理程序中做任何事情来阻止在Visual Studio的abort()实现结束时调用_exit(3) (我正在查看VS2005附带的源代码中的文件abort.c,第137行)。
因此,既然__declspec(noreturn)是一个实现的东西,而且在Visual Studio中实现abort永远不会正常返回,那么abort()应该用__declspec(noreturn)来标记。
由此可以得出,它的缺席是一个错误。
我认为你应该在https://connect.microsoft.com/VisualStudio/上报这是一个错误
https://stackoverflow.com/questions/3569643
复制相似问题