Tutto ciò che vi è più o meno standard (elaborazione di argomenti variabili) ad eccezione di __printf(2,3)
.
Questo modificatore alla funzione (simile ai static
o inline
modificatori) informa il compilatore che deve controllare la stringa di formato in argomento 2 (fmt
) contro le effettivi parametri partendo argomento 3, utilizzando il formato printf
stile prescrittori.
In altre parole, chiamandolo con:
dev_err (pDev, "%d", 1.0);
farebbe bandiera un avviso perché la stringa di formato e gli argomenti attuali non corrispondono.
Il
...
indica semplicemente che è presente un numero variabile di argomenti provenienti dopo la stringa di formato, simile al modo in cui è implementato lo stesso
printf
. C ha da tempo la capacità di elaborare elenchi di argomenti variabili, il modificatore
__printf()
fornisce semplicemente al compilatore un po 'di informazioni aggiuntive in modo che possa validare l'utilizzo della funzione.
Linux definisce __printf(a, b)
come __attribute__((format(printf, a, b)))
e gcc permette che secondo formato per specificare l'attributo varargs controllo secondo here (parafrasato sotto):
formato (archetipo, indici di stringhe, di prima to-check):
L'attributo format specifica che una funzione accetta gli argomenti di stile printf, scanf, strftime o strfmon che dovrebbero essere controllati mediante una stringa di formato. Ad esempio, la dichiarazione:
extern int my_printf (void *my_object, const char *my_format, ...)
__attribute__ ((format (printf, 2, 3)));
causa il compilatore di controllare gli argomenti nelle chiamate per my_printf per coerenza con lo stile printf argomento stringa di formato my_format.
Nell'esempio precedente, la stringa di formato (my_format) è il secondo argomento della funzione my_print, e gli argomenti per controllare iniziare con il terzo argomento, così i parametri corretti per l'attributo formato sono 2 e 3.
L'attributo format consente di identificare le proprie funzioni che accettano le stringhe di formato come argomenti, in modo che GCC possa controllare le chiamate a queste funzioni per gli errori.
Per quanto riguarda quello che la funzione stessa fa, non molto diverso da quello di tornare a zero :-)
E 'quasi certamente un segnaposto dovrebbe mai desiderare di implementare in realtà una vera e propria funzione di dev_err()
.
il terzo argomento significa che questa funzione richiede un numero variabile di argomenti, va_args; L'argomento – Ishmeet
'(...)' è per numeri variabili di argomenti, [controlla questo codice come funziona] (http://stackoverflow.com/questions/15967344/loop-through-char-c/15967653#15967653), nota come la stessa funzione viene chiamata con un numero diverso di argomenti. –
Cercando '__printf', ho scoperto che è un #define per un attributo qui descritto: http://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Function-Attributes.html – chris