2011-11-15 1 views
6

In Linux, container_of macro è racchiuso in parentesi apparentemente "extra":Perché abbiamo bisogno di parentesi attorno alla macro di blocco?

#define container_of(ptr, type, member) ({ \ 
       const typeof(((type *)0)->member) *__mptr = (ptr); 
       (type *)((char *)__mptr - offsetof(type,member));}) 

Invece di esso, possiamo semplicemente usare

#define container_of(ptr, type, member) { \ 
       const typeof(((type *)0)->member) *__mptr = (ptr); 
       (type *)((char *)__mptr - offsetof(type,member));} 

?

Le parentesi sono obbligatorie o sono solo per precauzione?

+0

Questo dovrebbe essere etichettato GCC piuttosto che C ....... –

risposta

9

({...}) è un gruppo rinforzato, un blocco di codice che può essere utilizzato all'interno di un'espressione. L'ultima affermazione determina il suo valore.

All'interno di macro lo si utilizza per consentire alle macro di comportarsi allo stesso modo delle funzioni. Principalmente sarebbe preferibile una funzione static inline.

Domande correlate:

+1

Grazie mille! – SHH