对函数式宏的参数名称中的前导下划线有意义吗?

时间:2013-04-29 20:07:28

标签: c linux gcc linux-kernel c-preprocessor

我遇到的一些预处理器宏的参数名称包含前导下划线;例如,在Linux内核中:

#define DEVICE_ATTR(_name, _mode, _show, _store) \
struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)

这些参数看起来就像常规宏参数一样,所以我无法弄清楚为什么作者决定为每个参数名称都有一个前导下划线。与_name串联是否有一些意义,或者下划线只是作者选择使用的约定?

1 个答案:

答案 0 :(得分:2)

不,没有特别的意义:这些是常规标识符。我猜测为什么作者决定添加这样的下划线是为了使这些属性的构成更清晰:

dev_attr_##_name

更容易阅读
dev_attr##name

然而,__ATTR看起来很可疑:在C中,标识符以下划线开头,后跟大写字母或另一个下划线are reserved for the implementation。在这种情况下,它是两个下划线,所以我希望__ATTR是一个系统宏。