【问题标题】:va_start warns " second parameter of 'va_start ' not last named argument"va_start 警告“'va_start' 的第二个参数不是最后命名的参数”
【发布时间】:2014-12-23 19:53:57
【问题描述】:

代码运行良好,但 gcc 和 clang 在 va_start 上报告了一个问题

stackoverflow 说要我多写点东西,但我真的不知道是什么 =)

int Matrix_cool_input (matrix *A, ... )
{
    int num = A->m * A->n;

    va_list arguments;
    va_start (arguments, num);

    int i,j;
    int rc = 0;
    double v;

    for (int x = 0; x < num; x++)
    {
        i = x / A->m;
        j = x % A->n;
        v = va_arg ( arguments, double );
        rc |= Matrix_set(A,i,j, v);
    }
    va_end(arguments);
    return rc;
}

【问题讨论】:

  • A 是可变参数 ... decl 之前的最后一个命名参数。你为什么要传递'num',一个局部自动变量?请参阅va_start 了解它应该如何使用。

标签: c function variables gcc warnings


【解决方案1】:

来自va_start()的手册页

void va_start(va_list ap, last);

va_start()

va_start() 宏初始化 ap 以供 va_arg() 和 va_end() 后续使用,并且必须首先调用。 参数last是变量参数列表之前最后一个参数的名称,即调用函数知道其类型的最后一个参数。

所以,va_start()应该name of the last argument before the variable argument list(即A)一起工作。您不应该向它传递任何其他值 [例如,根据您的情况,函数 local num]。

【讨论】:

    【解决方案2】:

    应该是

    va_start (arguments, A);
    

    将最后一个命名参数作为va_start 宏的第二个参数传递。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      相关资源
      最近更新 更多