gpt4 book ai didi

c - 如何对小型记录器使用可变参数?

转载 作者:行者123 更新时间:2023-11-30 18:36:13 25 4
gpt4 key购买 nike

我希望制作一个小型记录器,如下所示:

logger log;
const char* text = "World";
log.write("Hello %s", text);
log.write("Step %d", 1);

这是我的代码,无法正常工作:

class logger
{
public:
void write(const char* msg, ...)
{
FILE* file = fopen("c:/test.txt", "a");
if(file != NULL)
{
va_list args;
va_start(args, msg);
fprintf(file, "%s\n", msg, args);
va_end(args);
fclose(file);
}
}
};

这就是我得到的:

Hello %s
Step %d

我以前从未使用过varargs,所以我不确定我是否正确使用它。

最佳答案

您认为 C 的行为方式类似于 Java 或 Python 或其他语言,可以将数组参数“splat”到接受可变参数的函数,但 C 并没有那么复杂。当您将 args 传递给 fprintf 时,C 实际上将 args 的值(va_list 类型的变量)压入堆栈。您需要的是将 args 的内容压入堆栈。

或者,您可以使用接受 va_list 作为参数的函数。该函数是 vprintf (以及 friend vsprintf、 vfprintf 等)。

您还有另一个问题,即您使用“%s”对调用者的“msg”参数进行 fprintf 处理,但显然期望 fprintf 递归地使用结果作为格式字符串,并且 fprintf 也使用参数。那是行不通的。相反,只需使用调用者的消息作为格式字符串。

        va_list args;
va_start(args, msg);
vfprintf(file, msg, args);
fputc('\n', file);
va_end(args);

关于c - 如何对小型记录器使用可变参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42298756/

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