Dans une autre discussion, Emmanuel Delahaye me faisait remarquer que le format "m$" de printf n'est pas standard.
Pour info pour ceux qui ne connaissent pas, "m$" permet, quand printf le supporte, de numéroter les arguments, de sorte qu'il n'est nécessaire de les passer dans l'ordre exact où ils apparaissent dans la chaine de format. Ainsi pour dire qu'on a une voiture verte on peut faire :
printf("I have a %2$s %1$s\n", object, color);
Un des intérets majeurs est qu'on peut peut ainsi résister à une traduction qui changerait l'ordre des mots. Dans un programme internationalisé, on aurait par exemple :
printf(gettext("I have a %1$s %2$s\n"), color, object);
En français le message serait traduit en "J'ai une %2$s %1$s\n", qui afficherait bien "J'ai une voiture verte", et pas "J'ai une verte voiture".
Mais, puisque les "m$" ne sont pas standards, comment fait-on si on tient à produire du code portable ? Est-ce qu'il y a un autre mécanisme qui permet de passer les arguments dans le désordre à printf, ou est-on condamné à traduire les messages en conservant l'ordre des arguments ?
Partager