プログラミング言語 C の新機能 Part XII: 前定義識別名 __func__
(1999/05/16 [日])
お待たせしました。待望の機能の一つが入りました。それが前定義識別名 __func__ です。
さてさて、今まで皆さんはプログラムをどのようにデバッグをしてきましたか?何?デバッガを使っていた?そのような豪華な環境にある人は、この機能のありがたさを実感することが難しいかもしれません。
プログラムのデバッグにあたってまず大事なことは、いったいプログラムはどの部分を走っているのかということを知ることです。例えば、条件分岐をしたとき想定したコードの方をちゃんと通ったのかを知る必要があります。そのようなときには printf を埋め込んだりして、正しい方向にプログラムが実行しているかを検査する必要がありました。しかし、printf を埋め込んだ部分が多くなってくると、だんだんどこの printf の出力であるのかがわからなくなるといった問題がありました。
前定義識別名はこのような時効果を発揮します。例えば、今回導入された前定義識別名と可変長マクロ機能を組み合わせると次のようなことができます。
今度の C 言語では、この例の (1) で示しているように、各関数の入り口で __func__ という識別名があたかも自動的に宣言されたかのようになります。したがって、この関数のスコープ中 __func__ を参照することができます。__func__ はその関数の関数名が入ります。この場合、関数名が foo_bar なので __func__ は "foo_bar" をあらわすことになります。例の中では i が 3 ではないとデバッグコードを実行します。今 i が 5 であると考えると、「test.c 13 @foo_bar: i=5」のような表示がなされます。
このように、今回の C 言語の機能を使うことにより、デバッグコードをより簡単に美しく記述できるようになることがわかりますね。
さてさて、今まで皆さんはプログラムをどのようにデバッグをしてきましたか?何?デバッガを使っていた?そのような豪華な環境にある人は、この機能のありがたさを実感することが難しいかもしれません。
プログラムのデバッグにあたってまず大事なことは、いったいプログラムはどの部分を走っているのかということを知ることです。例えば、条件分岐をしたとき想定したコードの方をちゃんと通ったのかを知る必要があります。そのようなときには printf を埋め込んだりして、正しい方向にプログラムが実行しているかを検査する必要がありました。しかし、printf を埋め込んだ部分が多くなってくると、だんだんどこの printf の出力であるのかがわからなくなるといった問題がありました。
前定義識別名はこのような時効果を発揮します。例えば、今回導入された前定義識別名と可変長マクロ機能を組み合わせると次のようなことができます。
/* * 前定義識別名 __func__ 使用例 (c)1999 seclan * ver1.00 1999/05/16 最初のバージョン */ #define dbg(...) \ (printf("%s %u @%s:",__FILE__,__LINE__,__func__), \ printf(" "__VA_ARGS__)) int foo_bar(int i) { //static const char __func__[] = "foo_bar"; //(1) if(i != 3){ dbg("i=%d", i); i *= i; } return i; } |
今度の C 言語では、この例の (1) で示しているように、各関数の入り口で __func__ という識別名があたかも自動的に宣言されたかのようになります。したがって、この関数のスコープ中 __func__ を参照することができます。__func__ はその関数の関数名が入ります。この場合、関数名が foo_bar なので __func__ は "foo_bar" をあらわすことになります。例の中では i が 3 ではないとデバッグコードを実行します。今 i が 5 であると考えると、「test.c 13 @foo_bar: i=5」のような表示がなされます。
このように、今回の C 言語の機能を使うことにより、デバッグコードをより簡単に美しく記述できるようになることがわかりますね。
by seclan