2014年5月7日

__func__ はマクロではない

GCCに備わっている__func__は、C99規格に適合して、そのスコープの関数名の文字列にコンパイラが自動変換するので、デバッグ用に便利だ。しかし、この文字列への変換はC言語で言うところの「マクロ」ではない。

だから、以下のような使用はコンパイルエラーになる。


size_t some_func(void)
{
        return strlen("<" __func__ ">");
}


むしろ、以下の宣言と等価と考えた方がよい。

size_t some_func(void)
{
        static const char __func__[] = "some_func";
        return strlen("<" __func__ ">");
}

これはGCCのマニュアルに明記されている。

__FILE__とか__LINE__は本物のマクロだから、strlen("<" __FILE__ ">")のような書き方ができる。

ただし、もう一つの注意点は、__FILE__はプリプロセッサがファイルを処理したときのファイルパスだから、#includeで展開されたファイルパスの__FILE__は、例えば /usr/include/myheader.h になるし、Linuxのカーネルのソースファイル中では fs/btrfs/inode.c のようになる。

0 件のコメント:

コメントを投稿