gpt4 book ai didi

c - 帮助理解 C stdarg 宏(va_start ...)

转载 作者:太空宇宙 更新时间:2023-11-04 07:41:41 24 4
gpt4 key购买 nike

最近我遇到了这个函数(在记录器类中使用)。我了解它的作用,但我不知道如何:

void Reporter::print( const char* szFormat, ...)
{
// note: m_out is a FILE*
va_list args;
va_start(args, szFormat);
vfprintf( m_out, szFormat, args);
va_end(args);
}

我读了reference ,但我仍然不清楚。最让我烦恼的是这不能按预期工作。我得到最后一个数字 0 和字符串 (null),尽管它应该打印一些大于 0 的数字和文件路径。

案例 1:

rep.print( "Values: %08X %08X %08X %08X %08X %08X %d %s\n", val1, val2, val3, val4, val5, val6, source.GetLength(), szPath );
// source.GetLength() returns a size_t, szPath is a const char* and IS indeed a valid string

但是把它改成这个效果很好:

案例 2:

rep.print( "Values: %08X %08X %08X %08X %08X %08X", val1, val2, val3, val4, val5, val6 );
rep.print( " %d %s\n", source.GetLength(), szPath );

请注意,我正在 MSVC++ 2008 下编译。相同的代码在 gcc 下工作正常(即使是第一种情况)。 Reporter::print() 的实现或我使用该函数的方式是否存在错误?我怎样才能确保即使在第一种情况下调用它也能正常工作?为什么它甚至会失败?

最佳答案

Reporter::print 的代码很好。它所做的只是正确初始化 args 以引用可变参数列表,然后将该可变参数列表传递给 vfprintf(),它知道如何处理它。

您的问题可能是 %d 格式说明符(需要 int 类型参数)与 source 返回值的类型不匹配。 GetLength()(我猜这可能是一个 size_t)。如果您知道长度总是适合 int,那么您可以通过转换来解决它:

..., (int)source.GetLength(), ...

(这是因为编译器不知道作为可变参数列表一部分的参数的预期类型,这与正常的原型(prototype)函数声明不同)。

关于c - 帮助理解 C stdarg 宏(va_start ...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3280194/

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