noreturn

提供: Appmethod Topics
移動先: 案内検索

キーワード(アルファベット順):インデックス への移動



構文

FUNCTION NAME [[noreturn]]

説明

noreturn 属性は、関数が戻らないことを指定します(たとえば、アプリケーションを終了させる関数、無限ループを実行する関数、例外を送出する関数などの場合)。 つまり、制御フローが呼び出し側の関数に戻らないということです。 noreturn と指定された関数が呼び出され、最終的に return 文が実行される場合は、プログラムが不正な形式と見なされ、コンパイラ エラーが発生します。

例:

void f [[noreturn]] () 
{
   throw "error";       // OK
}

void g [[noreturn]] (int i) 
{  // ill-formed
   if (i > 0)
      throw "positive";
}

この例では、コンパイラが E2541 エラーを生成します。これは、i が 0 以下の場合に、gvoid を返すためです。

noreturn 属性は返らない 2、3 のライブラリ関数(abortexit(C++) など)では便利です。 noreturn 属性を使用することによって返らない独自の関数を定義することもできます。

例:

void fatal(void) [[noreturn]];
void fatal(void)
{
   // ...
   exit(1);
}

noreturn キーワードにより C++ コンパイラは fatal が返らないことを認識します。 コンパイラは fatal が返った場合に発生する事態に関係なく最適化できます。 したがって、noreturn を使用することでより良いコードを作成できます。 さらに重要なことは、初期化されていない変数による "偽の" 警告を避けるのに役に立ちます。 関数を呼び出すことによって保存されたレジスタは noreturn 属性の関数を呼び出す前に復元されることを想定できません。 noreturn 関数で void 以外の戻り型を指定しても意味がありません。

移植性

POSIX  Win32  Win64  ANSI C  ANSI C++

deprecated

+

メモ: noreturn 属性は、Clang ベースの C++ コンパイラではサポートされていません。

関連項目