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

C言語の事前定義識別子__func__とは?使い方とサンプルコードを解説

識別子とは

識別子(identifier)とは、プログラム内の変数や関数などの実体を識別するために付ける名前のことです。

通常、識別子はプログラマが作業効率を高めるために自分で定義しますが、言語にあらかじめ組み込まれている「事前定義識別子」も存在します。C++のcoutやcinなどがその代表例です。

本記事では、C言語に用意されている事前定義識別子の一つである__func__について詳しく解説します。

__func__の正式な定義

C規格における__func__の正式な定義は次の通りです。

「翻訳処理系は、各関数定義の開き波括弧の直後に、あたかも次の宣言が存在するかのように、識別子__func__を暗黙的に宣言しなければならない。」
static const char __func__[] = "function-name";

ここでfunction-nameには、その宣言を字句的に囲んでいる関数の名前が入ります。

つまり__func__はコンパイラが自動的に生成する識別子であり、関数名を文字列として取得することで、現在実行中の関数を簡単に識別できます。

基本的な使い方

それでは、実際のコード例を見ながら概念をより深く理解していきましょう。

例1:複数の関数での使用

#include <stdio.h>
void function1(void){
    printf("%s\n", __func__);
}
void function2(void){
    printf("%s\n", __func__);
    function1();
}
int main(){
    function2();
    return 0;
}

出力

function2
function1

解説:この例では、__func__を使って呼び出された関数の名前を出力しています。__func__は、それが記述されている関数自身の名前を返すため、function2とfunction1のprintf文はそれぞれ自分の関数名を参照して表示します。

例2:main関数でも動作する

__func__はmain関数の中でも同様に機能します。

#include <stdio.h>
int main(){
    printf("%s\n", __func__);
    return 0;
}

出力

main

__func__は上書きできない

__func__は関数名専用として予約されている識別子のため、他の用途で上書きすることはできません。別の値を格納しようとするとコンパイルエラーになります。

例3:上書きを試みた場合

#include <stdio.h>
int __func__ = 123;
int main(){
    printf("%s\n", __func__);
    return 0;
}

出力

error

類似の事前定義識別子

C言語には、__func__と同様にデバッグなどで役立つ他の事前定義識別子も用意されています。

  • __FILE__:現在のソースファイル名を返します。
  • __LINE__:現在の行番号を返します。

例4:__func__・__FILE__・__LINE__の併用

#include <stdio.h>
void function1(){
    printf("The function: %s is in line: %d of the file :%s\n", __func__, __LINE__, __FILE__);
}
int main(){
    function1();
    return 0;
}

出力

The function: function1 is in line: 3 of the file :main.c

解説:これらの識別子を組み合わせることで、現在実行中の関数名、コードの行番号、ファイル名といった情報を一度に取得できます。ログ出力やデバッグ作業において非常に便利な機能なので、ぜひ活用してみてください。

  1. C言語のfillpoly()関数とは?図形の塗りつぶし方法を解説

    概要C言語のグラフィックス用ヘッダーファイル「graphics.h」には、三角形、四角形、五角形、六角形などの多角形(ポリゴン)を描画し、その内部を塗りつぶすための fillpoly() 関数が用意されています。この関数は、線のみを描く drawpoly() 関数と同じ引数を受け取る点が特徴です。構文void fillpoly( int number, int *polypoints );各引数の意味は以下の通りです。number:頂点の数を n とした場合、「n + 1」個の点の数を指定します。polypoints:「n × 2」個の整数からなる配列へのポインタです。整数は2つで1組となり、

  2. C言語のbar()関数とは?グラフィックスで塗りつぶし矩形を描く方法

    bar() 関数は、C言語のグラフィックス描画に使用される関数の一つです。図形を描くための各種関数がまとめられた graphics.h ヘッダーファイルの中に定義されており、このヘッダーをインクルードすることで利用できます。bar()関数の構文void bar(int left, int top, int right, int bottom);bar() 関数は、棒グラフの「バー」のような2次元の図形、すなわち塗りつぶされた長方形を描画するために使われます。引数は4つあり、それぞれ以下の座標を指定します。left / top: 長方形の左上隅の (X, Y) 座標right / bottom: