2011-04-01 84 views
0

假設我有一些宏#define NAME name,並且我想定義一些其他的宏,這些宏將擴展到引用的值。就是說,如果我也定義了#define NAME_STR "name"。有沒有比以下更好的方法?預處理器引用宏參數

#define QUOT(str) #str 
#define QUOT_ARG(str) QUOT(str) 
#define NAME_STR QUOT_ARG(NAME) 

回答

2

不是真的,因爲宏參數在使用字符串化時沒有展開。從GNU C PreProcessor manual

不同於一般的參數替代, 參數不是宏擴展 第一。這被稱爲字符串化。

來自同一來源:

如果你想字符串化 擴展宏論證的結果,你 必須使用宏的兩個層次。

...這用一個例子繼續:

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

的例子是一種誤導:'foo'不是宏替換成爲'4',直到它被替換列表中使用,因此它應該'xstr(foo)'變成'str(4)'變成'「4」'。說,有一點你有'xstr(4)'是誤導,我想。 – 2011-04-01 22:59:55

+0

@詹姆斯麥克奈利斯:同意,這個例子暗示了一些沿着自我指涉的宏觀的東西,事後不會擴大。我想知道我是否應該編輯這個例子,或者留下它以及這些評論...... – thkala 2011-04-01 23:32:34