【问题标题】:forwarding parameters from variadic function to fixed argument function将参数从可变参数函数转发到固定参数函数
【发布时间】:2011-07-31 00:05:35
【问题描述】:

我有一个函数,它接受可变数量的参数。我想从这个函数中调用具有固定数量参数的函数,

void log(int level, const char* format, ...)
{
    va_list args;
    va_start(args, fmt);

    int count = 0;
    void *navigator[10] = NULL;

    while ((navigator[count] = va_arg(args, char*) ) != NULL && count < 10) 
        ++count;   //Is this the right way to count no. of arguments passed ?


    fprintf(stderr, "**** No of arguments : %d\n", count);
    fflush(stderr);

    switch (count - 2)
    {
    case 0:
                log_l(level, fmt);
        break;
    case 1:
           log_l1(level, fmt, navigator[0]);  // how would I get arg1 here, 
                                              // I get NULL in the called function)*/
        break;
         .
         .
         .
         .
         .

    };
}

我想知道计算传递的参数数量的正确方法,然后正确地将它们转发给其他固定参数函数。

【问题讨论】:

    标签: c++ logging macros


    【解决方案1】:

    您的va_start 必须是va_start(args, format); // Note change to "format"

    编辑:即使根据来自va_arg 的联机帮助页,你也不能做你想做的事。

    如果没有实际的下一个参数, 或者 iftype 与实际 next 的类型不兼容 参数(根据默认参数 pro- 动作),行为未定义。

    但这是标记为 C++,所以为什么不使用 C++ 习语:使用流和插入 operator&lt;&lt; 而不是使用可变参数。

    【讨论】:

      【解决方案2】:

      没有办法 - 您需要明确传递此信息,例如使用计数参数或显式 0 作为最后一个参数。类型信息也不以任何形式传递。

      【讨论】:

      • 您还可以将有关计数和参数类型的信息隐式传递给“格式”参数。像printf 这样的一些函数就是这样使用的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      相关资源
      最近更新 更多