2012-11-05 20 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) 

co ja nie rozumiem, jest to„##” w printk, co to znaczy ##

printk(KERN_DEBUG f, ## a); 

Czy ktoś może mi pomóc zrozumieć, co jest ## w tym wierszu? dziękuję

+0

@Insilico to niewłaściwy człowiek, pytanie jest inne. Jest to dotyczące dyrektywy preprocesora "##" dla makr variadycznych i zauważ, że masz tylko '## a', a nie' g ## a'. –

+0

Aniket ma rację, nie jest to duplikat, ponieważ '## 'oznacza coś innego w tym kontekście niż w kontekście podanym w tym pytaniu. Każdy głosujący, aby zamknąć jako duplikat: proszę uważnie przeczytać przed tym. –

Odpowiedz

2

Jest tam, aby makro wariadyczne (makro, które może przyjmować wiele argumentów) działało, jeśli przekazałeś 0 argumentów.

Z Variadic Macros section w instrukcji GCC:

drugie, ## żeton operator pasta ma szczególne znaczenie, gdy umieszczone pomiędzy przecinkiem oraz zmienny argument. Jeśli piszesz

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

i zmienna argumentem jest pominięty, gdy używany jest eprintf makro, następnie przecinek przed ## zostaną usunięte. Nie stanie się to, jeśli przekażesz pusty argument, ani nie stanie się, jeśli token poprzedzający ## jest niczym innym niż przecinkiem.

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

Jeśli nie korzystać z tego, to byłoby rozszerzyć do frpintf(stderr, "success!\n",), która jest błąd składni.

+1

Dokładnie mówiłem ludziom, że nie jest tokenem Toster –

+0

proszę oddać ponownie głosowanie, to pytanie nie jest duplikatem i zostało zamknięte przez niektórych ludzi nieświadomie. To pytanie jest subtelnie różne i oryginalne: –

+0

@Aniket Rzucam ponowne głosowanie; Podejrzewam, że ty i ja to zrobiliśmy. Dzięki za poprawianie ludzi tutaj; frustrujące jest to, że zbyt szybko przeskakują błędną odpowiedź lub błędną decyzję o głosowaniu. –

3

To jest token dla makr variadic (makra z wieloma, zmiennymi argumentami). Jego specyficzna dyrektywa gcc, która zezwala na 0 lub więcej argumentów jako dane wejściowe, po f w ext4_debug(). Co oznacza, że ​​argument f jest obowiązkowy, a może lub nie może istnieć.

To jest to samo, co printf(const char *fmt,...) gdzie, fmt jest obowiązkowe, inne argumenty są opcjonalne i zależą od fmt. Zobacz ostatnie oświadczenie w tym dokumencie: http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html