gpt4 book ai didi

c++ - C/C++ va_arg - 有没有办法跳过一个参数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:50 26 4
gpt4 key购买 nike

我想为 sprintf() 添加功能。具体来说,我希望能够将我自己的 POD 数据类型传递给它,但我不确定如何执行此操作。

据说,如果您创建了 va_list,您可以将它传递给 vsprintf() 并让它为您完成艰苦的工作 - 但我仍然需要访问 va_list,并在将 va_list 传递给 vsprintf( ).

例如,假设以下代码:

struct mypod {
int somedata;
}; // just for example, you know

// somewhere else in the code...
mypod mp;
mp.somedata = 5325;
my_sprintf(myChrPtr, "%z", mp);

使用新的 %z 代码对应我的新数据类型。

我知道只能传递指针和 POD 结构,这没什么大不了的。不过,我想知道如果我到达 va_list 的末尾(通过使用 va_arg() 获取 args)然后将其传递给 vsprintf() 会发生什么?

谢谢!

最佳答案

鉴于必须以正确的顺序调用 va_arg 并使用正确的类型来实现正确的行为,我认为您必须在处理您关心的部分时零碎地使用 fmt关于并将其余部分传递给 vsprintf:

void
mysprintf(char *dst, char *fmt, ...)
{
char *p = fmt;
va_list va;

va_start(va, fmt);
do {
char *q = strchr(p, '|');
if (q) {
/* really should take const char *fmt and not write on it like this... */
*q++ = '\0';
}
dst += vsprintf(dst, p, va); /* let vsprintf do a subset */
if (q) {
dst += sprintf(dst, "%d", va_arg(va, int)); /* consume 1 int */
}
p = q;
} while (p);

va_end(va);
}


strcpy(fmt, "%s|%s|%s"); /* mutable fmt */
mysprintf(buf, fmt, "hello", 7, "world", 8, "!");

在我的示例中,我只是将 | 设置为类似于 %d,但是一个带有额外 %... 转义的真实示例会很多更复杂。

关于c++ - C/C++ va_arg - 有没有办法跳过一个参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5930370/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com