ふにゃるんv2

もとは、http://d.hatena.ne.jp/Wacky/

__func__マクロが使えるのは、どのバージョンからか?

ネットを、ぼ〜っと回っていると、面白いネタが紹介されていました。


__FUNC__マクロというのが使えるようです。
で、どのバージョンから使えるのだろう?ってんで、少し関係する情報をかき集めてみる事にしました。


ぱ〜っと調べてみると、以下のようです。

  • __func__は、"前定義識別名"と呼ぶらしく、要するに、関数の名前が格納されるらしい
    まぁ、__FILE__や__LINE__マクロと同じ動きですね
  • gccでは、結構昔から(2.95では既に実装済みみたい)用意されていたらしい
  • C99で、__func__が、正式に定義されている
  • VC6.0では定義されてないが、VC.NETでは定義されている
    但し、__func__でなく__FUNCTION__という名前で(一応、VC.NET 2003と2005で確認済み)


余談ですが、VC.NETでは、類似マクロとして、__FUNCDNAME__と__FUNCSIG__があるようです。(参考: http://msdn2.microsoft.com/ja-jp/library/b0084kay(vs.80,en-us).aspx)
効果は、以下の通り。

#include    <stdio.h>

int main(void)
{
    puts(__FUNCTION__);
    puts(__FUNCDNAME__);
    puts(__FUNCSIG__);
    return 0;
}

実行結果:
main
main
int __cdecl main(void)

なお、当然ですが、VC6.0では「定義されていない識別子です」と言われます。