Klar, printf(_("%s")) expandiert dann ja zu printf(gettext("%s")) und gettext wird dementsprechend vor printf aufgerufen.
Das liegt an der Klammerung, mit printf(_("s"),meldung) würde es gehen, wenn auch wieder so wie oben.
Grundsätzlich solltest du das gettext-Makro möglichst da aufrufen wo auch der zu übersetzende Text steht.
Solche Konstruktionen mit halboffenen Klammern und Semikolon im rechten Teil des Makros solltest du unbedingt vermeiden.