當(dāng)前位置:首頁 > IT技術(shù) > 系統(tǒng)服務(wù) > 正文

Linux驅(qū)動開發(fā)——__stringify
2021-09-09 14:02:29

在Linux內(nèi)核中有一個宏__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

開通會員,享受整站包年服務(wù)立即開通 >