16

在我的 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

进一步参考: C++0x 关于注解标准化的提案noreturn,其中说abort应该携带它。

编辑:看起来一堆讨论随着删除的答案消失了,但它的要点包含在缺陷报告 #048中。

4

1 回答 1

6

我认为这绝对是错误的,因为无论 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/将此报告为错误

于 2010-08-27T13:02:59.893 回答