我对可变长度参数调试日志打印功能有一个问题。我将在这里模拟代码。
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,...) *
提前感谢任何帮助。
答案 0 :(得分:3)
C varargs的设计不能超过一个级别;所需的堆栈操作对于语言来说太深了。通常情况下,在这种情况下,您的SecondPrint
版本与vprintf
- SecondPrintV
或类似版本相同,您可以FirstPrint
调用SecondPrintV
在提取varargs之后,而不是直接调用SecondPrint
(并且为了保持一致性,通常在内部SecondPrint
调用SecondPrintV
。
答案 1 :(得分:1)
您需要将va_list
传递给SecondPrint
,以便它可以访问FirstPrint
的参数
void SecondPrint(int level, const char* format, va_list args)
{
//Printing the log here
vprintf(format, arg);
}
void FirstPrint(int level, const char* format,...)
{
va_list args;
va_start(args, format);
SecondPrint(level, format, args);
va_end(args);
}
void main()
{
int level = 100;
FirstPrintf("Log level = %d message = %s \n",level,"Error message");
}
答案 2 :(得分:1)
有可能以特定的特定于平台的方式执行此操作,或者(因为参数在相同的顺序中完全相同)使用程序集来“替换”当前函数框架与要调用的函数。 GCC还an extension使用__builtin_apply_args()
和__builtin_apply()
函数(尽管你必须弄清楚如何计算堆栈参数数据的大小)。