首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以使用两级变长参数函数.?

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

Stack Overflow用户
提问于 2012-06-05 10:49:08
回答 3查看 169关注 0票数 1

变量参数调试日志打印函数有一个问题。我只是在这里模拟代码。

代码语言:javascript
复制
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错误消息”,但它的打印不像打印“错误消息”那样。

我不知道这个有什么问题。我怀疑从"SecondPrint“函数调用"FirstPrint”函数的方法。FirstPrint正在通过.但是它使用级别和格式参数调用SecondPrint。

我不能直接使用main的SecondPrint。我必须使用FirstPrint,而FirstPrint必须调用SecondPrint来打印日志。那么我怎么才能做到这一点..。我想使用VA_ARGS,但它只适用于宏定义,而不是函数定义。

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

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

EN

回答 3

Stack Overflow用户

发布于 2012-12-26 22:26:34

C varargs的设计不能超过一个级别;所需的堆栈操作对于语言来说太深了。通常,在这样的情况下,您将有一个版本的SecondPrint类似于vprintf -- SecondPrintV或类似的版本,并且在提取varargs之后让FirstPrint调用SecondPrintV,而不是直接调用SecondPrint (为了一致性,通常让SecondPrint在内部调用SecondPrintV )。

票数 3
EN

Stack Overflow用户

发布于 2012-12-26 23:44:18

您需要将一个va_list传递给SecondPrint,这样它就可以将参数访问到FirstPrint

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-12-27 05:51:50

可以通过特定的平台特定的方式来实现,或者(因为参数是完全相同的顺序)使用程序集“替换”当前的函数框架来调用函数。GCC还使用延伸来处理__builtin_apply_args()__builtin_apply()函数(尽管您必须想出如何计算堆栈参数数据的大小)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10895947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档