La macro offsetof es una de las cosas más sorprendentes en el lenguaje C. Le permite obtener el desplazamiento de un campo miembro en una estructura relativa a la dirección de la estructura.
Considere el siguiente fragmento de código.
#include #include #define offsetof (TYPE, MEMBER) ((size_t) & ((TYPE *) 0) -> MEMBER) struct abc { int a int b [4]; int c; } abc_inst; int main () { printf ("% lu% lu% lu \ n", offsetof (struct abc, a), offsetof (struct abc, b), offsetof (struct abc, c)); devuelve 0; }
La salida de este código será:
0 4 20
En otras palabras, la macro offsetof está devolviendo las ubicaciones relativas (desplazamientos) de la variable entera a, la matriz entera b y la variable de carácter c en la estructura abc.
- ¿Cuáles son algunos trucos y consejos de gramática?
- Master of Law: ¿Cuáles son los mejores hacks de Harvard Law School?
- ¿Cuáles son algunos hacks favoritos de sushi?
- ¿Cómo uso mi iPhone como enrutador inalámbrico?
- ¿Cuáles son algunos hacks de Gilt Groupe?
Cómo funciona:
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
El tipo de macro convierte un valor literal 0 en un puntero de la entrada TIPO. Esto hace que el compilador se comporte como si hubiera una instancia de una variable TYPE en la dirección 0. Esto hace que encontrar las compensaciones de un miembro individual sea tan simple como eliminar las referencias a sus direcciones, dado que la dirección base de la estructura es 0. Verá una cadena de caracteres adicional para (size_t) ya que el código se hace portátil en todas las arquitecturas.
Esto es muy útil cuando se implementan listas enlazadas de una manera radicalmente diferente a la que estamos acostumbrados. Esencialmente, puede pensar en un nodo de lista enlazada como dos manos (llamadas anterior y siguiente), que pueden sentarse en una estructura, y conectar esa estructura como parte de la lista enlazada. Hace que el diseño sea escalable, ya que desacopla los datos de su carga útil de los punteros de la lista vinculada. Por lo tanto, puede modificar la definición de la estructura e incluir tantos nodos de listas vinculadas como sea necesario.
Página en Kernelnewbies