在C语言中,参数可以跟随变量参数吗?

zfciruhq  于 2022-12-22  发布在  其他
关注(0)|答案(1)|浏览(138)

规范中是否允许在send()中的VA_ARGS后面插入终止参数?

#define VALIST_TERMINATOR   NULL
#define send(targ, ...)(compile_args(targ, __VA_ARGS__, VALIST_TERMINATOR))

void compile_args(int_t targ, ...)
{
    va_list a_list;
    va_start(a_list, targ);
        //parse args list
    va_end(a_list);
}
6kkfgxo0

6kkfgxo01#

我看不出标准中有任何东西阻止它。
标识符_ VA_ARGS只能出现在类似函数的宏的替换列表中,该宏在参数中使用省略号。
替换列表中出现的标识符
VA_ARGS _应被视为参数,变量参数应构成用于替换它的预处理令牌。
你可以很容易地测试它自己:

#define VALIST_TERMINATOR   NULL
#define mymacro(targ, ...) compile_args(targ, __VA_ARGS__, VALIST_TERMINATOR)

void compile_args(unsigned *targ, ...)
{
    unsigned *x;
    va_list a_list;
    va_start(a_list, targ);
    while((x = va_arg(a_list, unsigned *)))
    {
        printf("%x\n", *x);
    }
    va_end(a_list);
} 

int main(void)
{
    mymacro(&(unsigned){1}, &(unsigned){2}, &(unsigned){3}, &(unsigned){4});
}

https://godbolt.org/z/6aPWxaoMj

相关问题