noreturn
構文
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 以下の場合に、g
が void
を返すためです。
noreturn 属性は返らない 2、3 のライブラリ関数(abort や exit(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++ コンパイラではサポートされていません。