2013-07-24 22 views
5
static inline __printf(2, 3) 
int dev_err(const struct device *dev, const char *fmt, ...) 
{ return 0; } 

Che cosa fa __printf() e che cosa significa il terzo argomento (...) di dev_err? Sono in grado di visualizzare che questa funzione è una sorta di funzione generica. Che cosa fa?Cosa fa questa funzione generica?

+0

il terzo argomento significa che questa funzione richiede un numero variabile di argomenti, va_args; L'argomento – Ishmeet

+1

'(...)' è 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. –

+1

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

risposta

11

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().

0

__printf è una funzione probabilmente definito nella libreria che si sta utilizzando con il compilatore, e ... in dev_err significa che ci vuole numero variabile di argomenti, va_args;

+2

Hai sbagliato strada. 'dev_err' è la funzione e' __printf' è solo una macro. –