在我的 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
注释正在触发错误 C4716 http://msdn.microsoft.com/en-us/library/ft5xye74.aspx.
进一步参考:C++0x 标准化提案noreturn注解 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1453.htm,这说明了abort
应该携带它。
编辑:看起来一堆讨论随着删除的答案而消失,但其要点包含在缺陷报告#048 http://www.open-std.org/jtc1/sc22/wg14/docs/rr/dr_048.html.
我认为这绝对是错误的,因为无论 std 有何要求,Visual Studio 附带的 abort() 实现都永远不会从中止中返回。您无法在 SIGABRT 的信号处理程序中执行任何操作来阻止在 Visual Studio 的 abort() 实现结束时调用 _exit(3) (我正在查看文件 abort.c,随带的源代码中的第 137 行)对比 2005 年)。
因此,由于 __declspec(noreturn) 是一个实现,并且 Visual Studio 中 abort 的实现永远不会正常返回,因此 abort() 应该用 __declspec(noreturn) 标记。
由此可见,它的缺失是一个错误。
我认为你应该将此报告为错误https://connect.microsoft.com/VisualStudio/ https://connect.microsoft.com/VisualStudio/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)