• Linux驱动开发——__stringify


    在Linux内核中有一个宏__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 */

    其作用实际上就是 把  x 直接转换为字符串。其返回值就是字符串,而不是变量名。

    用法1:

       #define __ATTR(_name,_mode,_show,_store) { /
         .attr = {.name = __stringify(_name), .mode = _mode }, /
         .show = _show,     /
         .store = _store,     /
        }

    假设我们这样使用  __ATTR:   

                           __ATTR(var_name, 777,  show_function, store_function)

      那么,实际上 复制给  .attr.name 的值是 "var_name" ,而不是var_name 变量所代表的值。

    用法2:将枚举类型转换为字符串

    #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);
  • 相关阅读:
    作业2 四则运算
    自动生成小学四则运算题目(加强版)
    Oracle 转移符问题
    《一个程序猿的生命周期》有感
    自问自答总结
    The Last Reader Response——13-17
    读《构建之法》十一、十二章有感
    《构建之法》8,9,10,章有感
    第二天冲刺(个人工作)
    冲刺第一天(个人工作)
  • 原文地址:https://www.cnblogs.com/pengdonglin137/p/5788743.html
Copyright © 2020-2023  润新知