[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.37 文字列としての関数名

GNU CC は、現在の関数名を表す文字列変数を二つ前もって定義している。 変数 __FUNCTION__ は、ソースコードに現れた通りの関数名を表す。 変数 __PRETTY_FUNCTION__ は、言語に固有の形式で整形した関数名を 表す。

この二つは、C 言語の関数ではいつでも同じになるが、C++ の関数では 違ったものになる可能性がある。例えば、

 
extern "C" {
extern int printf (char *, ...);
}

class a {
 public:
  sub (int i)
    {
      printf ("__FUNCTION__ = %s\n", __FUNCTION__);
      printf ("__PRETTY_FUNCTION__ = %s\n", __PRETTY_FUNCTION__);
    }
};

int
main (void)
{
  a ax;
  ax.sub (0);
  return 0;
}

というプログラムの出力は以下のようになる。

 
__FUNCTION__ = sub
__PRETTY_FUNCTION__ = int  a::sub (int)

この二つの名前はマクロではなくて、定義済の文字列変数である。 例えば、関数の中で ‘#ifdef __FUNCTION__’ としても何も特別な 意味は持たない。プリプロセッサは __FUNCTION__ という識別子に ついて何も特別な処理を行なわないからである。


This document was generated using texi2html 1.78.