【问题标题】:How can we give arguments to the token-pasting operator parameter specified in the Macro function?我们如何为宏函数中指定的标记粘贴运算符参数提供参数?
【发布时间】:2022-01-13 23:56:54
【问题描述】:

我正在尝试使用 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”参数(即我生成的对象)是如何在宏中指定的呢?

【问题讨论】:

标签: c macros c-preprocessor


【解决方案1】:

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

【讨论】:

  • 因此,考虑到我的情况,如何将“枚举”对象与此宏一起使用?我必须编写静态内联函数吗?
  • @Purgoufr,udev_enumerate_unref() 是如何声明的?
  • 函数的用法一般是“udev_enumerate_unref(enumerate);”并且函数声明是“struct udev_enumerate *udev_enumerate_unref(struct udev_enumerate *udev_enumerate);”
  • @Purgoufr,返回类型是什么? void?
  • @tstanisi 返回类型为“struct udev_enumerate *”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 2018-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 2020-11-22
相关资源
最近更新 更多