Lo que está haciendo es idiomático, aunque un poco fea C.
Con el fin de convencer al compilador que sabes lo que estás haciendo, sin embargo, usted podría envolver la asignación en un conjunto adicional de paréntesis:
while((arg = va_arg(ap, int)))
Eso debería ocuparse de la advertencia.
Actualización:
añadiendo paréntesis alrededor de la asignación no parece suprimir la advertencia en el compilador C99 im usando (PellesC). - Gary Willoughby
¿Qué, no? A continuación, debe hacer que la prueba sea un poco más explícita:
while((arg = va_arg(ap, int)) != 0)
debería hacer el truco. También podría argumentarse que es un poco más legible.
Me preguntará lo que quiero decir con "levemente feo".
Al trabajar con otros idiomas, estoy acostumbrado a tener una clara separación entre probar y modificar. Está haciendo una prueba en ese while
de un valor, pero al mismo tiempo crea un efecto secundario (es decir, leyendo en el siguiente argumento). Como dije, esto se considera bastante normal, sí, "idiomático" en C porque muchos programadores C lo hacen; Creo que hay incluso ejemplos de código similar en K & R.
por preferencia personal, probablemente me reescribir esto como:
while (1) {
arg = va_arg(ap, int);
if (!arg) break;
...
}
Esto separa claramente la asignación de la prueba, y permite que el bucle stand alone como un bucle (potencialmente) infinito. Mucha gente consideraría mi código más feo; como dije, es una cuestión de preferencia personal.
su código de ejemplo está roto: el ciclo termina si 'arg == 0', pero nunca proporciona un argumento' 0' a 'Sum()'; si todos los argumentos opcionales tienen el mismo tipo, es mejor pasar una matriz en lugar de usar varargs y hacer algo de magia macro para que se vea bien: http://stackoverflow.com/questions/1375474/variable-arity-in-c/ 1375636 # 1375636 – Christoph
¡Buen punto! pero no afecta la pregunta. ¡Su macro es agradable y una mejor opción obvia! –