_Noreturn
キーワードと noreturn
マクロ (C11)
_Noreturn
キーワードは C11 で導入されました。 これにより、コンパイラに、適用される関数が呼び出し元に戻らないことが伝えられます。 このコンパイラは、_Noreturn
関数の呼び出しに続くコードは制御が渡らないことを認識します。 戻らない関数にはたとえば、abort があります。 制御フローが呼び出し元に戻る可能性がある場合、関数には _Noreturn
属性を与えないでください。
このキーワードは一般的に、<stdnoreturn.h> で提供され、_Noreturn
キーワードにマッピングされる便利なマクロ noreturn
で利用されます。
_Noreturn
(またはそれに等しい noreturn
) を使用することの主な利点は、今後それを読む人のために関数の意図を明確にすることであり、意図せず到達できないコードを検出することです。
noreturn
の印が付いた関数により、戻り値は呼び出し元に返されないため、値の型を含めることはできません。 void
になっている必要があります。
noreturn
マクロと _Noreturn
キーワードの使用例
次の例は、_Noreturn
キーワードとそれに等しい noreturn
マクロを示しています。
無視できるマクロ noreturn
を使用する場合、IntelliSense からは不適切なエラー E0065
が生成されることがあります。 これは、サンプルの実行を妨げるものではありません。
// Compile with Warning Level4 (/W4) and /std:c11
#include <stdio.h>
#include <stdlib.h>
#include <stdnoreturn.h>
noreturn void fatal_error(void)
{
exit(3);
}
_Noreturn void not_coming_back(void)
{
puts("There's no coming back");
fatal_error();
return; // warning C4645 - function declared with noreturn has a return statement
}
void done(void)
{
puts("We'll never get here");
}
int main(void)
{
not_coming_back();
done(); // warning c4702 - unreachable code
return 0;
}
必要条件
マクロ | 必須ヘッダー |
---|---|
noreturn |
<stdnoreturn.h> |
関連項目
/std (言語の標準バージョンを指定します)
/W4 (警告レベルを指定します)
C4702 警告
__declspec(noreturn)