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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 ?