今さら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をつければ良いみたい。
こうすると意図したとおりの動作をすることが分かった。
2007/09/11
C言語のマクロ
登録:
コメントの投稿 (Atom)
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
コメントを投稿