2012-11-05 17 views
6
#define ext4_debug(f, a...)      \ 
    do {        \ 
     printk(KERN_DEBUG "EXT4-fs DEBUG (%s, %d): %s:", \ 
      __FILE__, __LINE__, __func__);   \ 
     printk(KERN_DEBUG f, ## a);    \ 
    } while (0) 

quello che non capisco è questo"##" in printk, ciò che significa ##

printk(KERN_DEBUG f, ## a); 

Qualcuno potrebbe aiutarmi a capire che cosa è ## in questa linea? grazie

+0

@Insilico che è l'uomo sbagliato, la domanda posta è diversa. Riguarda la direttiva del preprocessore '##' per le macro variadic, e si noti che si ha solo '## a', e non' g ## a'. –

+0

Aniket ha ragione, questo non è un duplicato, perché '## 'significa qualcosa di diverso in questo contesto rispetto al contesto dato in quella domanda. Tutti votano per chiudersi come duplicato: per favore leggi più attentamente prima di farlo. –

risposta

2

È lì per far funzionare la macro variadic (macro che può assumere più argomenti) se si passano 0 argomenti.

Dal Variadic Macros section nel manuale GCC:

In secondo luogo, il ## operatore di pasta di token ha un significato speciale quando posto tra una virgola e un argomento variabile. Se si scrive

#define eprintf(format, ...) fprintf (stderr, format, ##__VA_ARGS__) 

e l'argomento variabile viene lasciato fuori quando viene utilizzata la macro eprintf, poi la virgola prima che il ## sarà cancellato. Questo non succede se passi un argomento vuoto, né accade se il token che precede ## è qualcosa di diverso da una virgola.

eprintf ("success!\n") 
    ==> fprintf(stderr, "success!\n"); 

Se non si utilizza questo, allora che espandere a frpintf(stderr, "success!\n",), che è un errore di sintassi.

+1

precisamente ho detto alla gente che non è il paster token –

+0

si prega di lanciare un riapertura del voto, questa domanda non è un duplicato, ed è stato chiuso da alcune persone inconsapevolmente. Questa domanda è leggermente diversa e originale –

+0

@Aniket Ho lanciato un voto di riapertura; Sospetto che tu e io l'avessimo fatto. Grazie per aver corretto le persone qui; è frustrante quando tutti salgono sulla risposta sbagliata o sbagliano la decisione di voto troppo velocemente. –

3

È un token per macro variadic (macro con argomenti multipli e variabili). La sua direttiva specifica gcc che consente di inserire 0 o più argomenti come input, dopo f in ext4_debug(). Il che significa che l'argomento f è obbligatorio, a potrebbe o potrebbe non esistere.

Questo è uguale a printf(const char *fmt,...) dove, fmt è obbligatorio, altri argomenti sono facoltativi e dipendenti dallo fmt. Vedere l'ultima dichiarazione in questo documento: http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html