« 子供には見せられない七夕の真実 | 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

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);
なんて呼び出してます。ほかにいい方法を募集中です。