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 */
看上述源代码,
__stringify(x...) 这个宏的实际展开为: #x
其作用实际上就是 把 x 直接转换为字符串。其返回值就是字符串,而不是变量名。
如
#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 变量所代表的值。
解析Linux内核中stringify宏的应用
本文详细解析了Linux内核中的stringify宏如何实现间接字符串化,并通过实际应用案例展示了其在宏定义中的作用,即如何将变量转换为字符串形式,而不只是变量名。
537

被折叠的 条评论
为什么被折叠?



