2013-12-20 73 views
3

兩者的區別define兩者的區別是什麼?

#define NUM     123 
#define NUM_TO_STRING1(x) #x 
#define NUM_TO_STRING(x) NUM_TO_STRING1(x) 

printf("NUM_TO_STRING1: %s\n", NUM_TO_STRING1(NUM)); 
printf("NUM_TO_STRING: %s\n", NUM_TO_STRING(NUM)); 

結果:

NUM_TO_STRING1: NUM 
NUM_TO_STRING: 123 

爲什麼NUM_TO_STRIN1不能改變NUM123

回答

2

看到這個鏈接:

Stringification

在它說結尾:

如果你想一個字符串化宏參數的擴張的結果,你必須使用宏的兩個層次。

#define xstr(s) str(s) 
#define str(s) #s 
#define foo 4 
str (foo) 
     ==> "foo" 
xstr (foo) 
     ==> xstr (4) 
     ==> str (4) 
     ==> "4" 

和在宏讀here關於參數掃描的順序:

宏參數是完全宏擴展它們代入宏體,之前,除非它們被字符串化或與粘貼其他令牌。替換之後,將再次掃描整個宏體(包括替換參數)以擴展宏。結果是參數被掃描兩次以擴展其中的宏調用

+0

基本上你的答案不是一個適合SO的答案,你只給出鏈接而沒有太多解釋。 –

+0

謝謝@JensGustedt,我已經更新了我的答案。 –

3

隨着#,你不問。所有#確實是stringify緊隨其後的東西。我認爲你想利用這個成語是常見的一種:

#define STR(_a) #_a 
#define XSTR(_a) STR(_a) 

#define BAR foo 

事到建立這樣,

STR(BAR) 

會給你"BAR"

XSTR(BAR) 

威爾給你"foo"

+0

+1,反而使事情更清晰,你可以只是附加一些類似於「因爲在傳遞給'STR'之前擴展了BAR'」? –

1

你的情況:

NUM_TO_STRING1(NUM)成爲NUM

以#,NUM被字符串化。不與123

NUM_TO_STRING更換(NUM)成爲NUM_TO_STRING1(123)

123字符串化,其結果是123

相關問題