2011-11-15 7 views
6

En Linux, container_of macro está encerrado en paréntesis, aparentemente "extra":¿Por qué necesitamos paréntesis alrededor de macro de bloque?

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

En lugar de ello, puede que sólo tiene que utilizar

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

?

¿Los paréntesis son obligatorios o solo por precaución?

+0

Esto se debe etiquetar GCC en lugar de C ....... –

Respuesta

9

({...}) es un grupo Braced, un bloque de código que se puede utilizar dentro de una expresión. La última declaración determina su valor.

Dentro de las macros se usa para permitir que las macros se comporten de la misma manera que las funciones. Principalmente una función static inline sería preferible.

preguntas relacionadas:

+1

¡Muchas gracias! – SHH

Cuestiones relacionadas