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

C言語の__func__識別子とは?現在の関数名を取得する方法を解説

C言語には、現在実行中の関数名を自動的に取得できる便利な識別子 __func__ が用意されています。この記事では、__func__ の基本的な使い方と動作について、サンプルコードを交えて解説します。

__func__ 識別子とは

__func__ は、C99規格で標準化された事前定義識別子(predefined identifier)で、その関数内で参照すると「現在の関数名」を文字列リテラルとして返します。

また、古いバージョンのCやC++、GCCなどのコンパイラでは、同等の機能を持つ __FUNCTION__ がサポートされている場合があります。移植性を考慮する場合は、C99以降に準拠した __func__ を使用するのが推奨されます。

サンプルコード

以下の例では、main() 関数と TestFunction() 関数のそれぞれの中で __func__ を参照し、関数名を出力しています。

#include <stdio.h>

void TestFunction() {
    printf("Output of __func__ is: %s\n", __func__);
}

int main() {
    printf("Output of __func__ is: %s\n", __func__);
    TestFunction();
    return 0;
}

実行結果

Output of __func__ is: main
Output of __func__ is: TestFunction

解説

実行結果を見ると、main() 内では mainTestFunction() 内では TestFunction というように、それぞれの関数名が正しく出力されていることがわかります。

__func__ は、以下のような場面で特に役立ちます。

  • デバッグログの出力:どの関数からログが出力されたかを自動的に記録できます。
  • エラーメッセージの生成:エラー発生箇所の関数名を埋め込むことで、問題の特定が容易になります。
  • トレース処理:関数の開始・終了を記録する際に関数名を手動で書く手間を省けます。

なお、__func__ はマクロではなく識別子であるため、プリプロセッサディレクティブ(#ifdef など)の中では使用できない点に注意してください。同様の目的のものとして、ファイル名を返す __FILE__ や行番号を返す __LINE__ といったマクロもあり、これらと組み合わせるとより詳細なデバッグ情報を出力できます。

  1. HTMLの<output>要素におけるfor属性の使い方

    <output>要素のfor属性とは <output>要素のfor属性は、計算結果と、その計算に使用された要素との関連性(リレーション)を明示的に設定するための属性です。フォーム内で動的な計算を行う際に、どの入力要素が結果に影響しているのかをブラウザや支援技術に対して伝える役割を果たします。 構文は以下の通りです。 <output for="id"> 上記の「id」には要素のIDを指定します。半角スペースで区切ることで、1つ以上の複数の要素を同時に指定することも可能です。ここで指定した要素によって、計算結果と計算元となる要素との関係が定

  2. 【C++入門】ストリームクラスの階層構造と入出力の基本を徹底解説

    C++におけるストリームとは C++における「ストリーム」とは、プログラムと入出力(I/O)デバイスの間でやり取りされる文字データの流れを指します。 ストリームクラスは、ファイルや入出力デバイスに対する入出力操作を扱うためのクラス群です。それぞれのクラスが固有の役割を持っており、プログラムの入力・出力を効率的に処理できます。 C++のすべてのストリームクラスは、iostreamライブラリにまとめられています。 まずは、ストリームクラスの階層構造を見てみましょう。 iostreamライブラリの主要クラス iosクラス iosクラスは、すべてのストリームクラスの基底クラス(ベースクラス)です。