将变量args从宏传递到需要va_list的函数

问题描述 投票:0回答:2
#define exampleA(buf, args...) \
        exampleB(buf, ##args); \
    }

#endif

exampleB函数声明为exampleB(char * buf,...)的地方。但是我需要将声明更改为exampleB(char * buf,va_list args)。如何才能相应地更改marco?

c c-preprocessor variadic-functions
2个回答
2
投票

您不能。为了创建va_list,您需要具有可变参数功能。没有可移植的工具来从参数列表创建va_list对象。

成对编写可变参数函数是很常见的:外部函数使用<stdarg.h>中的功能构造一个va_list,并将该列表直接传递给完成工作的函数。您会在标准I / O库中看到它,例如:printf/vprintf,fprintf/vfprintf,snprintf/vsnprintf,scanf/vscanf`,等等。

例如,这是从FreeBSD库中提取的fprintf函数的整个实现,可以用作这种样式的模型:

int
fprintf(FILE * __restrict fp, const char * __restrict fmt, ...)
{
    int ret;
    va_list ap;

    va_start(ap, fmt);
    ret = vfprintf_l(fp, __get_locale(), fmt, ap);
    va_end(ap);
    return (ret);
}

((有关Github上FreeBSD源代码库镜像中的完整文件,请参见lib/libc/stdio/fprintf.c。] >>

谈到便携性,


0
投票

我认为这不是您想象的那样。让我们考虑一个函数exampleX(char *,...):您传递的参数必须存在于某个地方,并假设它们被压入堆栈。 va_list宏知道这一点,可以从那里访问它们。离开该函数的那一刻,不能再将参数假定为位于堆栈中了。因此,您可以not

© www.soinside.com 2019 - 2024. All rights reserved.