Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語の_Noreturn関数指定子とは?使い方と警告の挙動を解説

C言語の _Noreturn 関数指定子は、C11規格で導入された機能の一つで、その関数が呼び出し元に制御を戻さないことをコンパイラに伝えるために使われます。典型的な例としては、exit()abort() のようにプログラムを終了させる関数が挙げられます。

この指定子を付けた関数の中で return 文を使用すると、コンパイル時に警告が出力されます。また、仮にビルドが通ったとしても、「戻らないはず」の関数が実際に呼び出し元へ戻ってきた場合、プログラムの動作は未定義となるため注意が必要です。

コード例1:_Noreturn関数でreturn文を使った場合

#include<stdio.h>

_Noreturn char function() {
    return 'T'; // 戻らないはずの関数が文字を返そうとしている
}

main() {
    printf("The returned value: %d\n", function);
}

出力結果

The program terminates abnormally
[Warning] function declared 'noreturn' has a 'return' statement

このように、_Noreturn が付いた関数内で return 文を記述すると、コンパイラから「noreturn宣言された関数にreturn文がある」という警告が出ます。さらに、呼び出し側は戻り値を期待して処理を続行できないため、実行時にも異常終了する可能性があります。

コード例2:通常の関数の場合

一方、通常の関数であれば return 文で値を返しても何の問題もありません。次の例では、整数86を正しく返しています。

#include<stdio.h>

int function() {
    return 86; // 値86を返す
}

main() {
    printf("The returned value: %d\n", function());
}

出力結果

The returned value: 86

補足:stdnoreturn.hヘッダーについて

C11では利便性のために、<stdnoreturn.h> ヘッダーに noreturn マクロが用意されています。これは _Noreturn の別名として定義されており、より読みやすいコードを書くことができます。

#include<stdnoreturn.h>

noreturn void fatal_error(void) {
    // エラー処理を行い、プログラムを終了するなどの用途に使用
}

なお、C++11以降では同等の機能が属性構文の [[noreturn]] として提供されている点も併せて覚えておくと良いでしょう。

  1. JavaScriptの関数から値を返す方法【return文の基本と実例】

    JavaScriptの関数から値を返すには、return文を使用します。return文は、関数内で処理した結果を呼び出し元に渡すための基本的な仕組みであり、あらゆるプログラムで頻繁に使われる重要な構文です。 ここでは、文字列と数値を連結して返すシンプルな例を通じて、return文の使い方を確認していきましょう。まずは、次のコードを実行してみてください。 サンプルコード <html>    <head>       <script>          func

  2. JavaScript関数からオブジェクトを返す方法をわかりやすく解説

    JavaScriptの関数からオブジェクトを返すには、return文を使用します。オブジェクト内のプロパティやメソッドにアクセスする際は、thisキーワードを活用すると便利です。この記事では、実際のコード例を使いながら、JavaScript関数からオブジェクトを返す基本的な方法を解説します。基本的な考え方JavaScriptでは、オブジェクトの中にメソッド(関数)を定義できます。そのメソッド内でreturn文を使えば、処理結果や値を呼び出し元に返すことができます。また、thisキーワードを参照することで、同じオブジェクト内の他のプロパティにアクセス可能です。サンプルコード以下のコードでは、従業