2016-05-12 57 views
6

Quando il C printf() e la sua famiglia sono compilati da gcc e -Wall viene utilizzato sulla riga di comando, il compilatore avverte sugli argomenti fuori posto in base alla stringa di formato che viene utilizzata. Ad esempio il codice seguente otterrebbe un messaggio di errore che dice che il formato ha specificato 3 argomenti ma in realtà hai solo passato in due.printf() argomenti wrapper da verificare gcc

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

Quando si scrive un wrapper alla printf(), come si fa a mantenere questa capacità? Una forma di funzione o una macro sarebbe ciò a cui riesco a pensare. Ma anche i parser semplici potrebbero essere accettabili.

Sullo stackoverflow è possibile trovare alcuni modi di scrivere un wrapper di printf. Due approcci comuni sono using vprintf with varargs e using __builtin_apply. Ho provato questi due approcci, nessuno ha funzionato.

risposta

3

È possibile utilizzare l'attributo di gcc formato per verificare i parametri rispetto alla stringa di formato.

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

controllare il manuale di gcc "6.31.1 Common Function Attributes"

+0

impressionante! funziona perfettamente! – minghua

+1

una nota se 'my_printf' è un membro della classe: aggiungi 1 alla numerazione degli argomenti. diventerebbe '__attributo__ ((format (printf, 3, 4)));' – minghua