解釋成分段標(biāo)志,對(duì)于每一段和前面比較,相同的就被替換。但是這樣做的結(jié)果是,
被替換段之間存在一些空格。如果我們不希望出現(xiàn)這些空格,就可以通過(guò)添加一些
##來(lái)替代空格。
宏定義沒(méi)有空格,但是依然表達(dá)有意義的定義: define add(a, b) a+b
#define A2(name, type) type name##_##type##_type
A2(a1, int); /* 等價(jià)于: int a1_int_type; */
”type”之間沒(méi)有被分隔,所以預(yù)處理器會(huì)把name_##type##_type解釋成3段:
“name_”、“type”、以及“_type”,這中間只有“type”是在宏前面出現(xiàn)過(guò)
的,所以它可以被宏替換。
預(yù)處理器會(huì)把name##_##type##_type解釋成4段:“name”、“_”、“type”
以及“_type”,這其間,就有兩個(gè)可以被宏替換了。
#define A1(name, type) type name_ ##type ##_type
<##前面隨意加上一些空格>
#define A2(name, type) type name ##_ ##type ##_type
那么
__stringify_1(linux) <==> ”linux”
MODULE_GENERIC_TABLE(type##_device,name)
2) #define MODULE_GENERIC_TABLE(gtype,name)
extern const struct gtype##_id __mod_##gtype##_table
__attribute__ ((unused, alias(__stringify(name))))
MODULE_DEVICE_TABLE(usb, products)
/*notes: struct usb_device_id products; */
<==> MODULE_GENERIC_TABLE(usb_device,products)
<==> extern const struct usb_device_id __mod_usb_device_table
__attribute__ ((unused, alias(”products”)))
給name加上雙引號(hào)。另外,還注意到一個(gè)外部變量”__mod_usb_device_table”被alias
到了本驅(qū)動(dòng)專(zhuān)用的由用戶(hù)自定義的變量products<usb_device_id類(lèi)型>。這個(gè)外部變量
是如何使用的,更多的信息請(qǐng)參看《probe()過(guò)程分析》。
用宏定義一個(gè)變量,直接使用該宏定義的變量名稱(chēng),編譯通過(guò)且運(yùn)行結(jié)果正確;
使用printf打印字符串?dāng)?shù)據(jù)。printf(”token macro is %s”, __stringify_1(a1));




