2012-05-08 72 views
55

我想弄清楚如何編寫一個宏,將一個變量名的字符串文字表示與變量本身一起傳遞給一個函數。如何使用宏參數作爲字符串文字?

例如給出以下函數。

void do_something(string name, int val) 
{ 
    cout << name << ": " << val << endl; 
} 

我想編寫一個宏,以便我能做到這一點:

int my_val = 5; 
CALL_DO_SOMETHING(my_val); 

這將打印出:my_val: 5

我試着做以下幾點:

#define CALL_DO_SOMETHING(VAR) do_something("VAR", VAR); 

但是,正如您可能猜到的那樣,引號內的VAR不會被替換,而只是作爲字符串傳遞文字「VAR」。所以我想知道是否有辦法讓宏參數變成一個字符串字面本身。

+0

你怎麼想使用這個? – chris

回答

92

使用預處理# operator

#define CALL_DO_SOMETHING(VAR) do_something(#VAR, VAR); 
22

你想使用字符串化操作:

#define STRING(s) #s 

int main() 
{ 
    const char * cstr = STRING(abc); //cstr == "abc" 
} 
5
#define NAME(x) printf("Hello " #x); 
main(){ 
    NAME(Ian) 
} 
//will print: Hello Ian 
+0

我不完全確定,但它看起來像'「你好」#x「'(和'#x」Hello「')導致字符串被粘在一起而沒有空間,這在某些情況下是期望的,所以這是相當不錯的答案 – Smar

+0

@Smar確保你把一個空間常量字符串後你好:'「你好」#x' – jack

+0

好,我是這麼認爲的,你應該編輯你的答案也因爲它是有價值的信息塊:) – Smar

0

或許你嘗試此解決方案:

#define QUANTIDISCHI 6 
#define QUDI(x) #x 
#define QUdi(x) QUDI(x) 
. . . 
. . . 
unsigned char TheNumber[] = "QUANTIDISCHI = " QUdi(QUANTIDISCHI) "\n"; 
相關問題