在 C 函数声明中 'params, ...)' 等于 'params...)'?

In C function declaration 'params, ...)' equal to 'params...)'?

全部 在glusterfs的函数中,有如下一个 注意:整个定义在 stack.h

//libglusterfs/src/glusterfs/stack.h

#define STACK_WIND(frame, rfn, obj, fn, params...)                             \
    STACK_WIND_COMMON(frame, rfn, 0, NULL, obj, fn, params)

#define STACK_WIND_COMMON(frame, rfn, has_cookie, cky, obj, fn, params...)     \
    do {                                                                       \
        ...  \
        next_xl_fn(_new, obj, params);                                         \
        THIS = old_THIS;                                                       \
    } while (0)

我没有google搜索任何关于解释这种声明方法的内容,任何想法都会受到赞赏?

params... 作为 function-like 宏的一部分是 C 标准化省略号作为 function-like 宏参数的一部分之前的 GNU 扩展。

https://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html#Variadic-Macros

如今,更喜欢__VA_ARGS__

In C function declaration 'params, ...)' equal to 'params...)'?

不,它们在 function-like 宏中不相等。第一个需要使用 __VA_ARGS__ 引用可变参数并使用 __VA_OPT__##__VA_ARGS__ 删除前导逗号。在 params...params 直接被包括逗号在内的所有参数替换。

仅使用省略号 , ...) 并使用 __VA_ARGS__ 将等于 , params...) 并使用 params.

在正常函数中 params... 作为 parameter-list 的一部分是无效的。