#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 */
所以这个宏就是把传给它的参数转成对应的字符串。这种用法可以被用于swich语句中
例如下面这段code中
#define PHY_STATE_STR(_state) \
case PHY_##_state: \
return __stringify(_state); \
这个switch 语句中首先给下面的每个DOWN/STARTING/READY前面通过PHY_##DOWN。然后变成PHY_DOWN,而这个是已经定义的了。最后通过__stringify(_state);将down变成字符串,这个时候有没有PHY 这个前缀,可读性更好。
static const char *phy_state_to_str(enum phy_state st)
{
switch (st) {
PHY_STATE_STR(DOWN)
PHY_STATE_STR(STARTING)
PHY_STATE_STR(READY)
}
return NULL;
}
enum phy_state {
PHY_DOWN = 0,
PHY_STARTING,
PHY_READY,
};
针对__stringify 还有一个作用就是将在makefile中定义的值变成字符串。例如在makefile中定义-DFOO=bar,然后在.c中通过__stringify(FOO)就转成"bar"
__stringify的作用等同于#
最新推荐文章于 2023-09-06 11:45:23 发布