在Linux內(nèi)核中有一個(gè)宏__stringify,在include/linux/stringify.h定義如下:
#ifndef __LINUX_STRINGIFY_H #define __LINUX_STRINGIFY_H /* Indirect stringification. Doing two levels allows the parameter to be a * macro itself. For example, compile with -DFOO=bar, __stringify(FOO) * converts to "bar". */ #define __stringify_1(x...) #x #define __stringify(x...) __stringify_1(x) #endif /* !__LINUX_STRINGIFY_H */
?
其作用實(shí)際上就是 把? x 直接轉(zhuǎn)換為字符串。其返回值就是字符串,而不是變量名。
用法1:
#define __ATTR(_name,_mode,_show,_store) { / .attr = {.name = __stringify(_name), .mode = _mode }, / .show = _show, / .store = _store, / }
假設(shè)我們這樣使用? __ATTR:???
?????????????????????? __ATTR(var_name, 777,? show_function, store_function)
??那么,實(shí)際上 復(fù)制給? .attr.name 的值是 "var_name" ,而不是var_name 變量所代表的值。
?
用法2:將枚舉類型轉(zhuǎn)換為字符串
#define WCD_MBHC_STRINGIFY(s) __stringify(s)
?
enum wcd_notify_event { WCD_EVENT_INVALID, /* events for micbias ON and OFF */ WCD_EVENT_PRE_MICBIAS_2_OFF, WCD_EVENT_POST_MICBIAS_2_OFF, WCD_EVENT_PRE_MICBIAS_2_ON, WCD_EVENT_POST_MICBIAS_2_ON,
?
static const char *wcd_mbhc_get_event_string(int event) { switch (event) { case WCD_EVENT_PRE_MICBIAS_2_OFF: return WCD_MBHC_STRINGIFY(WCD_EVENT_PRE_MICBIAS_2_OFF); case WCD_EVENT_POST_MICBIAS_2_OFF: return WCD_MBHC_STRINGIFY(WCD_EVENT_POST_MICBIAS_2_OFF); case WCD_EVENT_PRE_MICBIAS_2_ON: return WCD_MBHC_STRINGIFY(WCD_EVENT_PRE_MICBIAS_2_ON);
?
?
?
?
?
本文摘自 :https://blog.51cto.com/u