我们如何为宏函数中指定的标记粘贴运算符参数提供参数?

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