va_start警告“'va_start'的第二个参数不是最后命名的参数”

时间:2014-12-23 19:53:58

标签: c function variables gcc warnings

代码完美无缺,但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;
}

2 个答案:

答案 0 :(得分:1)

一定是

va_start (arguments, A);

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

答案 1 :(得分: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。您不应该传递任何其他值[例如,根据您的情况将函数本地num]传递给它。