变量参数调试日志打印函数有一个问题。我只是在这里模拟代码。
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错误消息”,但它的打印不像打印“错误消息”那样。
我不知道这个有什么问题。我怀疑从"SecondPrint“函数调用"FirstPrint”函数的方法。FirstPrint正在通过.但是它使用级别和格式参数调用SecondPrint。
我不能直接使用main的SecondPrint。我必须使用FirstPrint,而FirstPrint必须调用SecondPrint来打印日志。那么我怎么才能做到这一点..。我想使用VA_ARGS,但它只适用于宏定义,而不是函数定义。
还有一件事我不能做*#定义FirstPrint(a,b,.)...)* (a,b,SecondPrint)
任何帮助都是非常感谢的,提前感谢。
发布于 2012-12-26 22:26:34
C varargs的设计不能超过一个级别;所需的堆栈操作对于语言来说太深了。通常,在这样的情况下,您将有一个版本的SecondPrint类似于vprintf -- SecondPrintV或类似的版本,并且在提取varargs之后让FirstPrint调用SecondPrintV,而不是直接调用SecondPrint (为了一致性,通常让SecondPrint在内部调用SecondPrintV )。
发布于 2012-12-26 23:44:18
您需要将一个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");
}发布于 2012-12-27 05:51:50
可以通过特定的平台特定的方式来实现,或者(因为参数是完全相同的顺序)使用程序集“替换”当前的函数框架来调用函数。GCC还使用延伸来处理__builtin_apply_args()和__builtin_apply()函数(尽管您必须想出如何计算堆栈参数数据的大小)。
https://stackoverflow.com/questions/10895947
复制相似问题