Строковые аргументы макроса в вызове многоуровневого макроса

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

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

(Реальные макросы немного сложнее, чем показано здесь. Я знаю, что макросы — это зло.)


person n. 1.8e9-where's-my-share m.    schedule 09.12.2011    source источник
comment
@Steve Jessop: Что-то вроде Look ma, FOO+BAR=579 было бы неплохо ;)   -  person n. 1.8e9-where's-my-share m.    schedule 09.12.2011


Ответы (1)


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

я бы сделал что-то вроде этого

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

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

person Jens Gustedt    schedule 09.12.2011
comment
Спасибо. Изменение исходного макроса нежелательно, но если ничего не помогает... - person n. 1.8e9-where's-my-share m.; 09.12.2011
comment
@Jens: Возможно, __VA_ARGS__, а не __VA_ARG__? - person Joseph Quinsey; 09.12.2011
comment
@JosephQuinsey, скорее всего. Это результат того, что обычно используется автозаполнение, поэтому мне никогда не приходится запоминать точное написание таких случайных имен. Я отредактирую это. - person Jens Gustedt; 09.12.2011