4Fermer6
ZephLe 09/08/2011 à 22:49
Pour résumer ici ce que j'ai posté sur IRC :

Les va_args qu'utilise printf sont lus en fonction du contenu du format, c'est à dire que le nombre de "%s", "%i" & co doivent exactement correspondre aux arguments passés à la fonction. Ces arguments sont connus à la compilation, donc en toute logique on peut s'attendre à ce que le format le soit également, et donc qu'il soit spécifié sous la forme d'une chaine littérale à l'endroit où est appelée printf (en quelques sortes ça fait partie de la signature de l'appel, donc ça doit apparaître au même endroit). GCC en profite d'ailleurs pour vérifier que le format et les arguments de printf sont bien cohérents (nombre + types), mais il ne peut faire ça que si le format est passé sous la forme d'une chaine littérale.

Bref, même si techniquement utiliser une variable comme chaine de format est valide, ça n'est pas une bonne idée, et c'est ce qui motive ce warning. Après, pourquoi tu l'as sous Linux et pas avec MinGW, aucune idée. Google me dit que ce warning est activé par le switch "-Wformat-nonliteral", peut-être l'as-tu utilisé dans un cas et pas dans l'autre ? Ou bien est-ce que c'est une feature non supportée par le GCC utilisé par MinGW ?

Dans tous les cas, deux remarques restent à mon avis vraies :

- Ce warning est justifié, le format de printf devrait toujours être une chaine littérale pour éviter les erreurs
- Dans ton cas, Link a raison, printf ne sert à rien et pourrait être remplacé par fputs (plus rapide)