我们如何为宏函数中指定的标记粘贴运算符参数提供参数?
How can we give arguments to the token-pasting operator parameter specified in the Macro function?
我正在尝试使用 systemd 的辅助宏,但我不太了解其工作机制。系统宏如下;
#define DEFINE_TRIVIAL_CLEANUP_FUNC(type, func) \
static inline void func##p(type *p) { \
if (*p) \
*p = func(*p); \
}
我不明白如何在上面提到的宏中将“p”参数作为参数。我想用一个例子来解释这个问题。
首先,我创建了udev枚举对象;
struct udev_enumerate* enumerate = udev_enumerate_new(pudev);
当我以后想删除这个对象时,如何使用 systemd 宏来完成?
DEFINE_TRIVIAL_CLEANUP_FUNC(struct udev_enumerate*, udev_enumerate_unref);
类型和功能是根据宏指定的,但是宏中的“p”参数(即我制作的对象)是如何在宏中指定的?
"p" 不是参数。这只是一个文本“p”。我想它的目的是为了“指针”这个词。我在 link 找到了提到的行。看起来该宏用于为给定的清理函数创建一个包装器,该函数检查给定的 指针是否不是 NULL
并且 将指针设置为清除对象到空哨兵。我可以猜到尾随的“p”是这个项目中使用的命名约定。在用这个宏创建了一些清理函数之后,还有一些其他的函数,比如 freep()
和 unmaskp()
.
例如 DEFINE_TRIVIAL_CLEANUP_FUNC(int, myclean)
扩展为:
static inline void mycleanp(int *p) {
if (*p)
*p = myclean(*p);
}
假设 udev_enumerate_unref()
声明为:
struct udev_enumerate *udev_enumerate_unref(struct udev_enumerate *udev_enumerate);
可以使用以下方式创建包装:
DEFINE_TRIVIAL_CLEANUP_FUNC(struct udev_enumerate *, udev_enumerate_unref)
并用作:
struct udev_enumerate* enumerate = udev_enumerate_new(pudev);
... do stuff with `enumerate`
udev_enumerate_unrefp(&enumerate);
我正在尝试使用 systemd 的辅助宏,但我不太了解其工作机制。系统宏如下;
#define DEFINE_TRIVIAL_CLEANUP_FUNC(type, func) \
static inline void func##p(type *p) { \
if (*p) \
*p = func(*p); \
}
我不明白如何在上面提到的宏中将“p”参数作为参数。我想用一个例子来解释这个问题。
首先,我创建了udev枚举对象;
struct udev_enumerate* enumerate = udev_enumerate_new(pudev);
当我以后想删除这个对象时,如何使用 systemd 宏来完成?
DEFINE_TRIVIAL_CLEANUP_FUNC(struct udev_enumerate*, udev_enumerate_unref);
类型和功能是根据宏指定的,但是宏中的“p”参数(即我制作的对象)是如何在宏中指定的?
"p" 不是参数。这只是一个文本“p”。我想它的目的是为了“指针”这个词。我在 link 找到了提到的行。看起来该宏用于为给定的清理函数创建一个包装器,该函数检查给定的 指针是否不是 NULL
并且 将指针设置为清除对象到空哨兵。我可以猜到尾随的“p”是这个项目中使用的命名约定。在用这个宏创建了一些清理函数之后,还有一些其他的函数,比如 freep()
和 unmaskp()
.
例如 DEFINE_TRIVIAL_CLEANUP_FUNC(int, myclean)
扩展为:
static inline void mycleanp(int *p) {
if (*p)
*p = myclean(*p);
}
假设 udev_enumerate_unref()
声明为:
struct udev_enumerate *udev_enumerate_unref(struct udev_enumerate *udev_enumerate);
可以使用以下方式创建包装:
DEFINE_TRIVIAL_CLEANUP_FUNC(struct udev_enumerate *, udev_enumerate_unref)
并用作:
struct udev_enumerate* enumerate = udev_enumerate_new(pudev);
... do stuff with `enumerate`
udev_enumerate_unrefp(&enumerate);