Ce que vous faites est idiomatiques, si légèrement laid C.
Afin de convaincre le compilateur que vous savez ce que vous faites, cependant, vous pouvez envelopper l'affectation dans un ensemble supplémentaire de parenthèses:
while((arg = va_arg(ap, int)))
Cela devrait prendre en compte l'avertissement.
Mise à jour:
ajoutant entre parenthèses autour de la mission ne semble pas supress l'avertissement du compilateur C99 im en utilisant (PellesC). - Gary Willoughby
Qu'est-ce qui n'a pas fonctionné? Ensuite, vous devez rendre le test un peu plus explicite:
while((arg = va_arg(ap, int)) != 0)
devrait faire l'affaire. On pourrait aussi soutenir qu'il est légèrement plus lisible.
Vous allez me demander ce que je veux dire par "légèrement moche". De travailler avec d'autres langues, j'ai l'habitude d'avoir une séparation claire entre tester et modifier. Vous faites un test dans ce while
d'une valeur, mais en même temps vous créez un effet secondaire (lire dans l'argument suivant). Comme je l'ai dit, cela est considéré comme assez normal, voire "idiomatique" en C parce que beaucoup de programmeurs en C le font; Je pense qu'il ya même des exemples de code similaire dans K & R.
Par préférence personnelle, je serais probablement réécrire ce que:
while (1) {
arg = va_arg(ap, int);
if (!arg) break;
...
}
Cela sépare clairement l'affectation du test, et laisse la boucle autonome comme une boucle (potentiellement) infinie. Beaucoup de gens considéreraient mon code plus laid; Comme je l'ai dit, c'est une question de préférence personnelle.
votre exemple de code est cassé: la boucle se termine si 'arg == 0', mais vous ne fournissez jamais un argument' 0' à 'Sum()'; Si tous les arguments optionnels ont le même type, il est préférable de passer un tableau au lieu d'utiliser varargs et de faire un peu de magie pour le rendre joli: http://stackoverflow.com/questions/1375474/variable-arity-in-c/ 1375636 # 1375636 – Christoph
Bon point! mais cela n'affecte pas la question. Votre macro est sympa et un meilleur choix évident! –