Струнизация макро аргументов в многоуровневом вызове макроса - PullRequest
3 голосов
/ 09 декабря 2011

У меня есть такой макрос:

#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 так, чтобыон делает правильные вещи?

(Действительные макросы немного сложнее, чем показано здесь. Я знаю, что макросы - это зло.)

1 Ответ

3 голосов
/ 09 декабря 2011

Макросы похожи на кухонные ножи, с ними можно делать злые вещи, но они не являются злыми как таковые.

Я бы сделал что-то подобное

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

, который в качестве дополнительной функции будет работать, даже если выражение содержит запятую.

...