0
假設我有一些宏#define NAME name
,並且我想定義一些其他的宏,這些宏將擴展到引用的值。就是說,如果我也定義了#define NAME_STR "name"
。有沒有比以下更好的方法?預處理器引用宏參數
#define QUOT(str) #str
#define QUOT_ARG(str) QUOT(str)
#define NAME_STR QUOT_ARG(NAME)
假設我有一些宏#define NAME name
,並且我想定義一些其他的宏,這些宏將擴展到引用的值。就是說,如果我也定義了#define NAME_STR "name"
。有沒有比以下更好的方法?預處理器引用宏參數
#define QUOT(str) #str
#define QUOT_ARG(str) QUOT(str)
#define NAME_STR QUOT_ARG(NAME)
不是真的,因爲宏參數在使用字符串化時沒有展開。從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"
的例子是一種誤導:'foo'不是宏替換成爲'4',直到它被替換列表中使用,因此它應該'xstr(foo)'變成'str(4)'變成'「4」'。說,有一點你有'xstr(4)'是誤導,我想。 – 2011-04-01 22:59:55
@詹姆斯麥克奈利斯:同意,這個例子暗示了一些沿着自我指涉的宏觀的東西,事後不會擴大。我想知道我是否應該編輯這個例子,或者留下它以及這些評論...... – thkala 2011-04-01 23:32:34