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 提案noreturnabort

編集: 削除された回答で一連の議論が消えたように見えますが、その要点はDefect Report #048でカバーされています。

4

1 に答える 1

6

std の義務に関係なく、Visual Studio に同梱されている abort() 実装は中止から戻ることはないため、これは間違いなく間違っていると思います。Visual Studio の abort() 実装の最後に _exit(3) が呼び出されるのを防ぐ SIGABRT のシグナル ハンドラーでは何もできません (付属のソースのファイル abort.c の 137 行を見ています)。 VS 2005)。

したがって、__declspec(noreturn) は実装であり、Visual Studio での中止の実装は決して正常に戻ることはないため、abort() は __declspec(noreturn) でタグ付けする必要があります。

したがって、それがないのはバグです。

https://connect.microsoft.com/VisualStudio/でこれをバグとして報告する必要があると思います

于 2010-08-27T13:02:59.893 に答える