在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);

Linux驱动开发——__stringify的更多相关文章

  1. 嵌入式Linux驱动开发日记

    嵌入式Linux驱动开发日记 主机硬件环境 开发机:虚拟机Ubuntu12.04 内存: 1G 硬盘:80GB 目标板硬件环境 CPU: SP5V210 (开发板:QT210) SDRAM: 512M ...

  2. 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

  3. 【转】linux驱动开发的经典书籍

    原文网址:http://www.cnblogs.com/xmphoenix/archive/2012/03/27/2420044.html Linux驱动学习的最大困惑在于书籍的缺乏,市面上最常见的书 ...

  4. Linux驱动开发 -- 打开dev_dbg()

    Linux驱动开发 -- 打开dev_dbg() -- :: 分类: LINUX linux设备驱动调试,我们在内核中看到内核使用dev_dbg来控制输出信息,这个函数的实质是调用printk(KER ...

  5. Linux驱动开发学习的一些必要步骤

      1. 学会写简单的makefile 2. 编一应用程序,可以用makefile跑起来 3. 学会写驱动的makefile 4. 写一简单char驱动,makefile编译通过,可以insmod, ...

  6. 驱动编程思想之初体验 --------------- 嵌入式linux驱动开发之点亮LED

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

  7. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

  8. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html   IT168 技术文档]在开始步入L ...

  9. Linux内核(17) - 高效学习Linux驱动开发

    这本<Linux内核修炼之道>已经开卖(网上的链接为: 卓越.当当.china-pub ),虽然是严肃文学,但为了保证流畅性,大部分文字我还都是斟词灼句,反复的念几遍才写上去的,尽量考虑到 ...

随机推荐

  1. List<String[]>

    1.List<Sttring[]>的用法 List<String[]> list = new ArrayList<String[]>();//声明一个List< ...

  2. 解决Win7下VC++6.0与Office不兼容的问题

    在Windows7下安装Visual C++ 6.0后,如果同时安装了Microsoft Office就会出现打开文件的时候出现异常,而导致VC6崩溃. 微软已经为我们解决了问题,开发出一个插件(Fi ...

  3. ios图片添加文字或者水印

    在项目中,我们会对图片做一些处理,但是我们要记住,一般在客户端做图片处理的数量不宜太多,因为受设备性能的限制,如果批量的处理图片,将会带来交互体验性上的一些问题.首先让我们来看看在图片上添加文字的方法 ...

  4. 团队spring会议1

    一.我们在近期进行了第一次计划会议,会议过程大致如下: 1.确定所做项目的方向: 2.将调查问卷的结果进行统计,做了需求分析,大致了解了用户的想法: 3.确定了团队计划backlog: 4.将任务进行 ...

  5. WPF Loaded事件连续调用两次的问题

    最近开发的一套系统中,在检查开发成员的代码时候,在Loaded事件中加上以下语句: this.Loaded -= new RoutedEventHandler(***_Loaded);这让我觉得有些奇 ...

  6. asp.net identity 2.2.0 中角色启用和基本使用(三)

    创建控制器 第一步:在controllers文件夹上点右键>添加>控制器, 我这里选的是“MVC5 控制器-空”,名称设置为:RolesAdminController.cs 第二步:添加命 ...

  7. [后端人员耍前端系列]KnockoutJs篇:使用WebApi+Bootstrap+KnockoutJs打造单页面程序

    一.前言 在前一个专题快速介绍了KnockoutJs相关知识点,也写了一些简单例子,希望通过这些例子大家可以快速入门KnockoutJs.为了让大家可以清楚地看到KnockoutJs在实际项目中的应用 ...

  8. [.NET领域驱动设计实战系列]专题五:网上书店规约模式、工作单元模式的引入以及购物车的实现

    一.前言 在前面2篇博文中,我分别介绍了规约模式和工作单元模式,有了前面2篇博文的铺垫之后,下面就具体看看如何把这两种模式引入到之前的网上书店案例里. 二.规约模式的引入 在第三专题我们已经详细介绍了 ...

  9. Linux系统中如何挂载第二块硬盘

    一.检测硬盘能否被识别 # fdisk -l Disk /dev/sda: 36.7 GB, 36703934464 bytes 255 heads, 63 sectors/track, 4462 c ...

  10. Sql Server对象管理器的使用

    VS提供了很多便捷的工具,Sql Server对象管理器可以直接在VS里面访问数据库,不用再打开一个Management Studio.这里记录下Sql Server对象管理器的使用. 1.先在视图里 ...