2007/09/11

C言語のマクロ

今さらC言語(笑)

C言語のマクロ(#define)にパラメータの文字列化というものがある。

#define TRACE( param ) printf( "%s = %d\n", #param, param );
このようなマクロを定義したときに

int value = 0;
TRACE( value );
とすると、

printf( "%s = %d\n", "value", value );
と展開される。
意外と便利な機能なのでよく使うんだけど、(UNICODEのような)ワイドキャラクタの環境になると

printf( "%ws = %d\n", "value", value );
たとえば上記のようになり、正しく表示されない。

本来は

printf( "%ws = %d\n", L"value", value );
このようにしたい。

対処は意外と簡単で、文字列化を使った場合、単純に文字列になるだけなので、

#define TRACE( param ) printf( "%ws = %d\n", L#param, param );
といったように、#の前にワイドキャラクタを表すLをつければ良いみたい。

こうすると意図したとおりの動作をすることが分かった。

1 件のコメント:

匿名 さんのコメント...

#define MATH_FUNC(name) double mathfunc_ ## name( double v );

とやって、
マクロってやると、

MATH_FUNC(sin)
MATH_FUNC(cos)
MATH_FUNC(tan)
MATH_FUNC(sqrt)

こうなちゃうのが面白いぞ。

double mathfunc_sin ( double v );
double mathfunc_cos ( double v );
double mathfunc_tan ( double v );
double mathfunc_sqrt ( double v );

何に使うかって?
いや、これはまだおさわり。
杉浦さんは邪悪度と派手さを上げるために(本当はもっと崇高な・・・)、ここからヒトヒネリして実装に耐えうるコードにしまする。
FURRY