gpt4 book ai didi

c - 如何向现有可变参数列表添加新参数?

转载 作者:太空狗 更新时间:2023-10-29 16:31:51 25 4
gpt4 key购买 nike

在多线程程序中,我正在编写一个接受可变参数列表的自定义打印函数。

void t_printf(char * str, ...)
{
if(file_ptr != NULL)
{
va_list ap;
va_start(ap, str);

vfprintf(file_ptr, str, ap);

va_end(ap);

fflush(file_ptr);
}
}

在此函数中,我想将当前线程 ID(使用 pthread_self())添加到打印的消息中。我该怎么做?有没有办法将它添加到现有的 va_list 中?

最佳答案

使用可变宏:

使用可变参数宏,您可以调用带有前置或附加参数的函数:

#define t_printf(format, args...) \
_t_printf(format, thread_id, __VA_ARGS__);

这会在其他参数之前添加 thread_id。 (请注意,在 _t_printf() 函数中,您还必须修改格式字符串。)

如果你这样做:

t_printf("some format string", a, b, c);

这将扩展执行此操作:

_t_printf("some format string", thread_id, a, b, c);

如果调用 t_printf() 时没有其他格式参数,您将有一个尾随逗号。 GCC 有一个 ## 扩展,负责根据需要添加逗号:

#define t_printf(format, args...) \
_t_printf(format, thread_id ##__VA_ARGS__);

使用宏的完整解决方案:

#define t_printf(format, args...) \
_t_printf(format, thread_id, __VA_ARGS__);

void _t_printf(char * str, ...)
{
if(file_ptr != NULL)
{
char format[1024];

/* safely prefix the format string with [thread_id: %x] */
snprintf(format, sizeof(format), "%s%s", "[thread_id: %x] ", str);

va_list ap;
va_start(ap, str);

vfprintf(file_ptr, format, ap);

va_end(ap);

fflush(file_ptr);
}
}

不修改参数

另一种解决方案是执行两次 printf():

vsnprintf(buffer, bufsize, str, ap);
vfprintf(file_ptr, "[thread_id: %x] %s", thread_id, buffer);

完整的解决方案:

void _t_printf(char * str, ...)
{
if(file_ptr != NULL)
{
char buffer[1024];

va_list ap;
va_start(ap, str);

vsnprintf(buffer, sizeof(buffer), str, ap);
vfprintf(file_ptr, "[thread_id: %x] %s", thread_id, buffer);

va_end(ap);

fflush(file_ptr);
}
}

关于c - 如何向现有可变参数列表添加新参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7228873/

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