gpt4 book ai didi

c - vprintf 使用的参数数量

转载 作者:行者123 更新时间:2023-11-30 20:00:07 24 4
gpt4 key购买 nike

我有一个围绕 printf 函数的包装器:

enum Color {
Black, White
};

void my_printf(char *fmt, ...)
{
char big_buffer[1024];
/* do some stuff */

va_list myargs;
va_start(myargs, fmt);
int ret = vsprintf(big_buffer, fmt, myargs);

/* process arguments that were not processed by vprintf */

va_end(myargs);

}

/* example of usage */
my_printf("%d %ld %y %y\n", 3, 3L, Black, White); /* %y - knows how to printf colors */

fmt 可以包含标准 printf 说明符和我的自定义说明符。在 fmt 字符串中,自定义说明符始终位于标准说明符之后。为了处理标准说明符,我使用 vprintf,然后处理 vprintf 未处理的参数。目前要做到这一点,我必须手动解析 fmt 字符串,并根据 fmt 中的说明符执行多个 va_arg 操作,但这很容易出错。是否可以使用某些函数来为我执行适当的多个 va_arg 操作?

我尝试在vprintf之后使用myargs。似乎有效。但据我了解,在将 va_list 对象传递给可能使用 va_arg 的其他函数后使用它们是非法的。

注意:我知道在这种特殊情况下,我可以在调用 my_printf 之前将 color 转换为字符串并使用 %s<fmt 中的/strong> 说明符而不是 %y。这只是一个简化的例子。所以我的想法是,我有自定义说明符,并且必须在 my_printf 内处理它们。因此,无需提出我不应该使用自定义说明符的答案。

最佳答案

Is it possible to use some function that will do appropriate multiple va_arg for me?

不,没有标准函数可以执行适当的多个va_arg。如果 vsprintf(big_buffer, fmt, myargs); 遇到无效的打印说明符,则结果是未定义行为。 (UB)。

At the moment to do that I have to parse fmt string manually and do multiple va_arg depending on specifiers in fmt but it is error prone

这是你必须做的。

<小时/>

考虑发布一个问题,其中包含您用于手动解析 fmt 字符串的代码,我们可以帮助您减少出错的可能性。

<小时/>

替代方案:代码可以调用不同的 print(...) 方法,从而不需要显式编码的类型说明符。 Example

关于c - vprintf 使用的参数数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48037914/

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