2011-12-09 37 views
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,使其做正確的事情?

(實際宏比這裏稍顯複雜。我知道,宏是邪惡的。)

+2

你想要什麼? –

+0

@Steve Jessop:像'看上去媽,FOO + BAR = 579'會很好;) –

回答

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

這彷彿表達式包含逗號一個額外的功能甚至會工作。

+0

謝謝。更改原始宏是不可取的,但如果沒有其他的幫助... –

+0

@Jens:也許'__VA_ARGS__'而不是'__VA_ARG__'? –

+0

@JosephQuinsey,最有可能的。這是通常自動完成的結果,所以我不必記住這些隨機名稱的確切拼寫。我會編輯它。 –