C函数中的变量参数列表 – 如何正确遍历arg列表?

在以下C程序中,我收到警告:

警告#2030:在条件表达式中使用’=’.

究竟是什么问题,我该如何避免这个?迭代变量参数的正确方法是什么?

#include <stdio.h>
#include <stdarg.h>

int Sum(int a, int b, ...)
{
    int arg;
    int Sum = a + b;

    va_list ap;
    va_start(ap, b);

    while(arg = va_arg(ap, int))
    {
        Sum += arg;
    }
    va_end(ap);

    return Sum;
}

int main(int argc, char *argv[])
{
    printf("%d\n", Sum(1, 2, 4, 8));

    return 0;
}
最佳答案
你做的是惯用的,如果有点丑陋C.

但是,为了说服编译器您知道自己在做什么,可以将赋值包装到另外一组括号中:

while((arg = va_arg(ap, int)))

那应该照顾警告.

更新:

adding parenthesis around the assignment doesn’t seem to supress the warning in the C99 compiler im using (PellesC). – Gary Willoughby

什么,它没有?然后你需要让测试更加明确:

while((arg = va_arg(ap, int)) != 0)

应该做的伎俩.它也可以被认为更具可读性.

你会问“我有点丑陋”.

从使用其他语言开始,我习惯于在测试和修改之间进行明确的分离.你正在测试一个值,但同时产生一个副作用(即在下一个参数中读取).正如我所说,这被认为是很正常的,因为很多C程序员都这样做,所以在C语言中是“惯用的”;我认为在K& R中甚至有类似代码的例子.

根据个人喜好,我可能会将其重写为:

while (1) {
  arg = va_arg(ap, int);
  if (!arg) break;
  ...
}

这清楚地将赋值与测试分开,并使循环独立于(可能)无限循环.很多人会认为我的代码更难看;正如我所说,这是个人偏好的问题.

转载注明原文:C函数中的变量参数列表 – 如何正确遍历arg列表? - 代码日志