1

我对可变长度参数调试日志打印功能有一个问题。我将在这里模拟代码。

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 通过 ... 接收剩余的参数,但它使用 level 和 format 参数调用 SecondPrint。

我不能直接从 main 使用 SecondPrint。我必须使用 FirstPrint 并且 FirstPrint 必须调用 SecondPrint 来打印日志。那么我怎样才能实现这一目标.. 我想使用VA_ARGS但它仅用于宏定义而不是函数定义。

还有一件事我不能做 * #define FirstPrint(a,b,...) SecondPrint(a,b,...) *

任何帮助都非常感谢提前感谢。

4

3 回答 3

3

C varargs 的设计目的不是为了传递一个以上的级别;所需的那种必要的堆栈操作对于该语言来说太深了。通常,在这种情况下,您将有一个类似于 -- 或类似的版本SecondPrintvprintf并且SecondPrintV您将在提取可变参数后FirstPrint调用,而不是直接调用(并且为了保持一致性,通常在内部调用)。SecondPrintVSecondPrintSecondPrintSecondPrintV

于 2012-12-26T22:26:34.850 回答
1

可以通过特定平台特定的方式来执行此操作,或者(因为参数以相同的顺序完全相同)使用汇编将当前函数框架“替换”为要调用的函数。GCC 还具有使用and函数的扩展(尽管您必须以某种方式弄清楚如何计算堆栈参数数据的大小)。__builtin_apply_args()__builtin_apply()

于 2012-12-27T05:51:50.430 回答
1

您需要传递一个va_listto 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-26T23:44:18.087 回答