3

私はこのようなマクロを持っています:

#define SHOW_EXPR(x) printf ("%s=%d\n", #x, (x))

できます:

#define FOO 123
int BAR = 456;
SHOW_EXPR(FOO+BAR);

これは期待どおりに印刷FOO+BAR=579されます。

ここで、SHOW_EXPRを呼び出すマクロを定義しようとしています。

#define MY_SHOW_EXPR(x) (printf ("Look ma, "), SHOW_EXPR(x))
MY_SHOW_EXPR(FOO+BAR)

Look ma, 123+BAR=579これも期待通りに印刷されますが、これは私が望んでいることではありません。

正しいことをするようにMY_SHOW_EXPRを定義することは可能ですか?

(実際のマクロは、ここに示されているよりも少し複雑です。マクロが悪であることはわかっています。)

4

1 に答える 1

3

マクロは包丁のようなものです。マクロを使って悪いことをすることはできますが、それ自体は悪いことではありません。

私はこのようなことをします

#define SHOW_EXPR_(STR, EXP) printf (STR "=%d\n", EXP)
#define SHOW_EXPR(...) SHOW_EXPR_(#__VA_ARGS__, (__VA_ARGS__))
#define MY_SHOW_EXPR(...) SHOW_EXPR_("Look ma, " #__VA_ARGS__, (__VA_ARGS__))

これは追加機能として、式にコンマが含まれている場合でも機能します。

于 2011-12-09T13:09:37.767 に答える