_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)