2016-05-12 6 views
6

Wenn die C printf() und seine Familie zusammengestellt wird durch gcc und -Wall auf Kommandozeile überprüft werden, warnt der Compiler über Argumente verlegt entsprechend dem Format Zeichenfolge, die verwendet wird. Als Beispiel würde der folgende Code eine Fehlermeldung erhalten, die besagt, dass das Format 3 Argumente angegeben hat, aber tatsächlich nur zwei übergeben wurden.printf() wrapper Argumente gcc

printf("%d%d%d", 1, 2); 

Wenn ein Wrapper zum printf() schreiben, wie Sie diese Fähigkeit behalten haben? Eine Form der Funktion oder eines Makros wäre das, worüber ich nachdenken könnte. Aber auch einfache Parser könnten akzeptabel sein.

Auf dem Stackoverflow gibt es einige Möglichkeiten, einen Printf-Wrapper zu schreiben. Zwei übliche Ansätze sind using vprintf with varargs und using __builtin_apply. Ich habe diese beiden Ansätze ausprobiert, keiner hat funktioniert.

Antwort

3

Sie können das Funktionsattribut gcc im Format verwenden, um die Parameter anhand der Formatzeichenfolge zu überprüfen.

extern int my_printf (void *my_object, const char *my_format, ...) 
      __attribute__ ((format (printf, 2, 3))); 

Überprüfen Sie die gcc Handbuch "6.31.1 Common Function Attributes"

+0

awesome! es funktioniert perfekt! – minghua

+1

ein Hinweis, wenn 'my_printf' ein Klassenmitglied ist: fügen Sie der Argumentnummerierung 1 hinzu. es würde '__attribute__ ((format (printf, 3, 4)));' – minghua