C 在多级宏调用中字符串化宏参数

C 在多级宏调用中字符串化宏参数,c,macros,c-preprocessor,variadic-macros,stringification,C,Macros,C Preprocessor,Variadic Macros,Stringification,我有这样一个宏: #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) 这会打

我有这样一个宏:

#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)
这会打印出
lookma,123+BAR=579
,这也是预期的,但这不是我想要的

是否可以定义MY_SHOW_EXPR,使其能够正确地执行操作


(实际的宏比这里显示的要复杂一些。我知道宏是邪恶的。)

宏就像厨房的刀子,你可以用它们做邪恶的事情,但它们本身并不邪恶

我会这样做

#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__))

如果表达式中包含逗号,它作为一个额外功能甚至可以工作。

@Steve Jessop:Look ma,FOO+BAR=579之类的东西会很好;)谢谢更改原始宏是不可取的,但如果没有其他帮助的话…@Jens:很可能是
\uuva\uargs\uuv
,而不是
\uuva\uarg\uuv
?@JosephQuinsey,很可能是这样。这是通常自动补全的结果,所以我永远不必记住这些随机名字的确切拼写。我会编辑的。