« 子供には見せられない七夕の真実 | Home | GNU RとJavaScriptの無名再帰をやってみた »

July 13, 2010

プリプロセッサ命令#と##のメモ

 今日読んでいるコードに、知らなかったプリプロセッサ命令が出てきたのでメモ。

#include <stdio.h>

#define tcat(x,y,z) x ## y ## z
#define cat(x) # x

#define abc "Hello"

int main(void)
{
  printf("%s\n", tcat(a, b, c));
  printf("%s\n", cat(a b c));
  return 0;
}

実行すると、

chome@sid:~/src/test$ ./a.out 
Hello
a b c

となる。

No TrackBacks

TrackBack URL: http://www.argv.org/~chome/blog/mt-tb.cgi/215

1 Comment

K&Rのお尻の方に載っているやつですね。

ぼくの場合、状況が特殊ですが、とある処理系で「.iniファイルの
"Option"セクションに、変数名と同じキーでウィンドウの表示位置を読
み込みたい。ただし初期値は変数の中に入っている」なんてときに、

#define READ_FROM_INI(A) A = ini->ReadInteger("Option", #A, A)

と定義して

READ_FROM_INI(Top);

と呼んでます。利点は、コピペでLeftも記録するとき、三カ所出てくる
変更が一カ所で済む。逆に一カ所でも変更を忘れるとわかりづらいバグ
となります。

さらに「文字列も読み込みたい」なんて場合に

#define READ_FROM_INI(A, B) B = ini->Read##A("Option", #B, B)

と定義しておいて

READ_FROM_INI(Integer, Top);
READ_FROM_INI(String, Caption);

なんて呼び出してます。ほかにいい方法を募集中です。

About this Entry

This page contains a single entry by chomy published on July 13, 2010 7:46 PM.

子供には見せられない七夕の真実 was the previous entry in this blog.

GNU RとJavaScriptの無名再帰をやってみた is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.