2012-06-05 150 views
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通过...接收剩余的参数,但它调用带有级别和格式参数的SecondPrint。

我无法直接使用来自main的SecondPrint。 我必须使用FirstPrint并且FirstPrint必须调用SecondPrint才能打印日志。所以我怎样才能做到这一点..我想使用VA_ARGS但它只是宏定义不在函数定义。

还有一件事我做不到像* 的#define FirstPrint(A,B,...)SecondPrint(A,B,...) *

任何帮助是高度感谢提前感谢。

回答

3

C可变参数不能被设计为通过多个级别;所需的堆栈操作类型对语言来说太深刻了。通常情况下,在这样的情况下,你将有一个版本SecondPrint analagous来vprintf - SecondPrintV或相似的,你将有FirstPrint提取可变参数,而不是直接调用SecondPrint(和一致性后调用SecondPrintV,通常有SecondPrint内部调用SecondPrintV)。

1

你需要传递一个va_listSecondPrint,所以它可以访问参数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"); 
} 
1

也许可以做到在特定的平台特定的方式,或者(因为参数是完全相同的顺序)使用程序集来将“当前函数框架”替换为要调用的函数。 GCC也有an extension__builtin_apply_args()__builtin_apply()函数(虽然你必须以某种方式计算出如何计算堆栈参数数据的大小)。

相关问题