C 我可以使用两级变长参数函数吗。。。?
我对可变长度参数调试日志打印函数有一个问题。我将在这里模拟代码C 我可以使用两级变长参数函数吗。。。?,c,function,variables,arguments,variadic-functions,C,Function,Variables,Arguments,Variadic Functions,我对可变长度参数调试日志打印函数有一个问题。我将在这里模拟代码 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,..
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,但它只用于宏定义,不用于函数定义
还有一件事我不能做,比如定义FirstPrinta,b,。。。第二,A,b*
非常感谢您的帮助。C varargs的设计不允许通过多个级别;所需的必要堆栈操作对于该语言来说太深了。通常,在这种情况下,您会有一个版本的SecondPrint analagous to vprintf-SecondPrintV或类似版本,并且您会让FirstPrint在提取varargs后调用SecondPrintV,而不是直接调用SecondPrint,为了一致性,通常让SecondPrint在内部调用SecondPrintV。C varargs的设计不允许通过多个级别;所需的必要堆栈操作对于该语言来说太深了。通常,在这种情况下,您会有一个版本的SecondPrint analagous to vprintf-SecondPrintV或类似版本,并且您会让FirstPrint在提取varargs后调用SecondPrintV,而不是直接调用SecondPrint,为了一致性,通常让SecondPrint在内部调用SecondPrintV。您需要将va_列表传递给SecondPrint,以便它可以访问FirstPrint的参数 您需要将va_列表传递给SecondPrint,以便它可以访问FirstPrint的参数
可以通过特定于平台的方式执行此操作,或者由于参数以相同的顺序完全相同,因此可以使用assembly将当前函数框架替换为要调用的函数。GCC还必须使用uuu builtin_apply_args和uuu builtin_apply函数来实现这一点,尽管您必须设法找出如何计算堆栈参数数据的大小。可以通过特定于平台的方式来实现,或者,由于参数以相同的顺序完全相同,请使用assembly将当前函数框架替换为要调用的函数。GCC还必须使用_builtin_apply_参数和_builtin_apply函数,尽管您必须以某种方式找出如何计算堆栈参数数据的大小
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");
}