我可以使用两级可变长度参数函数......?

时间:2012-06-05 10:49:08

标签: 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,...)
{
   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,...) *

提前感谢任何帮助。

3 个答案:

答案 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()函数(尽管你必须弄清楚如何计算堆栈参数数据的大小)。