Namespaces
Variants

_Noreturn function specifier (since C11) (deprecated in C23)

From cppreference.net

関数が呼び出し元に戻らないことを指定します。

目次

翻訳のポイント: - 「Contents」を「目次」に翻訳 - HTMLタグ、属性、
タグ内のテキストは翻訳せず保持
- C++関連の専門用語(Syntax、Explanation、Keywords、Standard library、Example、References、See also)は原文のまま保持
- 数値、構造、フォーマットは完全に維持

構文

_Noreturn 関数宣言 (C11以降) (C23で非推奨)

説明

_Noreturn キーワードは関数宣言に現れ、その関数がreturn文の実行や関数本体の終端に到達することで戻らないことを指定します( longjmp の実行によって戻る可能性はあります)。 _Noreturn で宣言された関数が戻った場合、動作は未定義です。これを検出できる場合、コンパイラ診断が推奨されます。

_Noreturn 指定子は同じ関数宣言内に複数回現れることがあり、その動作は1回現れた場合と同じです。

この指定子は通常、ヘッダー <stdnoreturn.h> で提供される便利マクロ noreturn を通じて使用されます。

_Noreturn 関数指定子は非推奨となりました。 [[ noreturn ]] 属性を代わりに使用すべきです。

マクロ noreturn も同様に非推奨です。

(C23以降)

キーワード

_Noreturn

標準ライブラリ

以下の関数は標準ライブラリにおいて noreturn です:

(注:指示に従い、HTMLタグ・属性、 タグ内のテキスト、C++固有の用語は翻訳せず、元のフォーマットを保持しています。翻訳対象となるテキストが存在しないため、出力は入力と同一となります)

#include <stdio.h>
#include <stdlib.h>
#include <stdnoreturn.h>
// i <= 0 の場合、未定義動作を引き起こす
// i > 0 の場合、終了する
noreturn void exit_now(int i) // or _Noreturn void exit_now(int i)
{
    if (i > 0)
        exit(i);
}
int main(void)
{
    puts("Preparing to exit...");
    exit_now(2);
    puts("This code is never executed.");
}

出力:

Preparing to exit...

参考文献

  • C23規格 (ISO/IEC 9899:2024):
  • 6.7.4 関数指定子 (p: TBD)
  • 7.23 _Noreturn <stdnoreturn.h> (p: TBD)
  • C17規格 (ISO/IEC 9899:2018):
  • 6.7.4 関数指定子 (p: 90-91)
  • 7.23 _Noreturn <stdnoreturn.h> (p: 263)
  • C11標準 (ISO/IEC 9899:2011):
  • 6.7.4 関数指定子 (p: 125-127)
  • 7.23 _Noreturn <stdnoreturn.h> (p: 361)

関連項目

[[ noreturn ]] (C23) [[ _Noreturn ]] (C23) (deprecated)
関数が戻らないことを示す
(属性指定子)
C++ documentation for [[noreturn]]