我有一个像这样的宏:
#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以使其做正确的事情?
(实际的宏比这里显示的要复杂一点。我知道宏是邪恶的。)
答案 0 :(得分: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__))
如果表达式包含逗号,则作为额外功能甚至可以使用。