C 言語 マクロ講座 拡張編2007年03月17日 11時33分40秒

マクロには特別な値を持つ物が用意されている。

__LINE__ と __FILE__ は早い時期から実装されていた。__LINE__ は各ファイル中の行数に、 __FILE__ は各ファイル名に置換される。よく、デバッグなどの為に利用される。他の値とは違い置換される場所によって値が変わるのが特徴だ。

正確にはマクロではないが、__LINE__ や __FILE__ に似た動作をする __func__ が C99 で、制定された。これは、 関数名に置き換わる。プリプロセスでは、C 言語の関数の解析までやらないので、マクロからは関数名は解決できない。実際に、プリプロセスのみを行うと、__func__ のままなのが確認できる。


% cat predef.c 
#ifndef STDIO
  #include 
#endif

#define L __LINE__
#define LL L; \
  L

void function()
{
  printf("%s at %s on %d\n", __func__, __FILE__, __LINE__);
}

int main()
{
  L;
  function();
  LL;
}

プリプロセスのみを行う。__LINE__ は最終的に展開された位置での行数が与えられる。また、 #define の定義が複数行にわたった場合でも、展開先の行数が用いられるので全て同じ値になる。


% gcc -E -DSTDIO predef.c 
# 1 "predef.c"
# 1 ""
# 1 ""
# 1 "predef.c"
# 9 "predef.c"
void function()
{
  printf("%s at %s on %d\n", __func__, "predef.c", 11);
}

int main()
{
  16;
  function();
  18; 18;
}

実行結果はこうなる。


% make predef
cc -O2 -fno-strict-aliasing -pipe   predef.c  -o predef
% ./predef
function at predef.c on 11

前回次回

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2007/03/17/1292202/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。