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");
}