我有一个关于可变长度参数调试日志打印函数的问题。我将在这里模拟代码。
void SecondPrint(int level, const char* format,...)
{
//Printing the log here
va_list arg;
va_start(arg, format);
vprintf(format, arg);
va_end(arg);
}
void FirstPrint(int level, const char* format,...)
{
SecondPrint(level,format);
}
void main()
{
int level = 100;
FirstPrintf("Log level = %d message = %s \n",level,"Error message");
}
“SecondPrint”应该按预期打印“100 条错误消息”,但它并没有像那样打印“错误消息”。
我不明白这个有什么问题。我怀疑从“FirstPrint”函数调用“SecondPrint”的方式。 FirstPrint 正在通过...接收剩余的参数,但它使用级别和格式参数调用 SecondPrint。
我不能直接从 main 使用 SecondPrint。 我必须使用 FirstPrint 并且 FirstPrint 必须调用 SecondPrint 来打印日志。那么我怎样才能实现这个。我想使用 VA_ARGS 但它仅用于宏定义而不是函数定义。
还有一件事我不能像*#define FirstPrint(a,b,...) SecondPrint(a,b,...)*
非常感谢任何帮助提前致谢。
最佳答案
C 可变参数的设计目的不是为了传递超过一级;所需的那种必要的堆栈操作对于语言来说太深了。通常,在这种情况下,您将拥有类似于 vprintf
的 SecondPrint
版本——SecondPrintV
或类似版本,并且您将拥有 FirstPrint
在提取可变参数后调用 SecondPrintV
,而不是直接调用 SecondPrint
(并且,为了保持一致性,通常调用 SecondPrint
SecondPrintV
内部)。
关于我可以使用两级可变长度参数函数......?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10895947/