noreturn
Microsoft 固有の仕様
__declspec
属性は、関数が返されないことをコンパイラに通知します。 コンパイラは、 __declspec(noreturn)
関数の呼び出しに続くコードに到達不能であることを認識します。
コンパイラで値を返さないコントロール パスの関数が検出されると、警告 (C4715) またはエラー メッセージ (C2202) が生成されます。 戻らない関数が原因で制御パスに到達できない場合は、 __declspec(noreturn)
を使用して、この警告またはエラーを回避します。
Note
戻ることになっている関数に __declspec(noreturn)
を追加すると、未定義の動作になることがあります。
例
次の例では、 isZeroOrPositive
の引数が負の場合、 fatal
が呼び出されます。 その制御パスに return ステートメントがないため、すべてのコントロール パスが値を返すわけではないという警告 C4715 が発生します。 fatal
を__declspec(noreturn)
として宣言すると、その警告が軽減されます。これは、fatal()
がプログラムを終了するので意味がないため、望ましいことです。
// noreturn2.cpp
#include <exception>
__declspec(noreturn) void fatal()
{
std::terminate();
}
int isZeroOrPositive(int val)
{
if (val == 0)
{
return 0;
}
else if (val > 0)
{
return 1;
}
// this function terminates if val is negative
fatal();
}
int main()
{
isZeroOrPositive(123);
}
Microsoft 固有の仕様はここまで