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

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

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

最佳答案

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

关于我可以使用两级可变长度参数函数......?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10895947/

相关文章:

javascript - javascript 的参数不需要声明类型?

javascript - 为了让函数一 "know"对函数二中发生的事情使用react,参数是如何参与的?

javascript - 将变量与 window.location.href 一起使用

c++ - 在不重新绘制整个背景图的情况下为模型制作动画--OPENGL

c - 运行时检查失败 #2 - 变量 'thread no' 周围的堆栈已损坏

oop - 为什么使用类而不是函数?

php - Perl 有类似于 PHP 的 constant() 的东西吗?

java - 为什么变量显示0?

C 为结构中的成员分配枚举值?

c# - 我可以使用 Xcode 编写 Excel 插件吗?