#define exampleA(buf, args...) \
exampleB(buf, ##args); \
}
#endif
exampleB函数声明为exampleB(char * buf,...)的地方。但是我需要将声明更改为exampleB(char * buf,va_list args)。如何才能相应地更改marco?
您不能。为了创建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。] >>
谈到便携性,
我认为这不是您想象的那样。让我们考虑一个函数exampleX(char *,...)
:您传递的参数必须存在于某个地方,并假设它们被压入堆栈。 va_list
宏知道这一点,可以从那里访问它们。离开该函数的那一刻,不能再将参数假定为位于堆栈中了。因此,您可以not