2011-08-24 18 views
5

Quiero el offsetof() la línea param en mystruct1. He intentado¿Cómo se usa offsetof() en una estructura?

offsetof(struct mystruct1, rec.structPtr1.u_line.line) 

y también

offsetof(struct mystruct1, line) 

pero no funciona ninguno.

union { 
    struct mystruct1 structPtr1; 
    struct mystruct2 structPtr2; 
} rec; 

typedef struct mystruct1 { 
    union { 
     struct { 
      short len; 
      char buf[2]; 
     } line; 

     struct { 
      short len; 
     } logo; 

    } u_line; 
}; 
+0

¿No puede proporcionarnos un código compilable para las definiciones de estructura?O omita la 'struct mystruct2' ... –

+0

¿qué quiere decir con" ninguno funciona "? –

Respuesta

7

La macro offsetof() toma dos argumentos. El estándar C99 dice (en §7.17 <stddef.h>):

offsetof(type, member-designator) 

que se expande a una expresión constante entera que tiene el tipo size_t, el valor de que es el desplazamiento en bytes, el elemento de estructura (designado por member-designator), desde el comienzo de su estructura (designado por tipo). El tipo y el miembro de designador deberá ser tal que, dada

static type t; 

entonces la expresión &(t.member-designator) evalúa a una constante de dirección.

Por lo tanto, es necesario escribir:

offsetof(struct mystruct1, u_line.line); 

Sin embargo, podemos observar que la respuesta será cero, ya que mystruct1 contiene una union como el primer miembro (y única), y la parte line de es un elemento de la unión, por lo que estará en el desplazamiento 0.

+0

¡Gracias funcionó bien, gran explicación! – ken

0

Su struct mystruct1 tiene 1 miembro nombrado u_line. Se puede ver el desplazamiento de dicho miembro

offsetof(struct mystruct1, u_line); // should be 0 

o de los miembros en la línea si especifica cada "nivel de la paternidad"

offsetof(struct mystruct1, u_line.line); 
offsetof(struct mystruct1, u_line.line.buf); 
offsetof(struct mystruct1, u_line.logo); 
0

En primer lugar, AFAIK, offsetof está destinado a ser utilizado solo con miembros inmediatos de la estructura (¿estoy de acuerdo en esto?).

En segundo lugar, conocer los detalles internos de offsetof populares implementaciones que puedo sugerir tratando

offsetof(struct mystruct1, u_line.line) 

Esto debería funcionar. Si es estándar-obediente es una pregunta abierta para mí.

P.S. A juzgar por la respuesta de @Jonathan Leffler, esto debería funcionar.

+0

"¿tengo razón en esto?" No lo creo (después de probar gcc). gcc acepta miembros "profundos" en expresiones 'offsetof'. – pmg

+1

@pmg: Bueno, preguntas como esta no pueden ser respondidas por "pruebas". – AnT

+0

Derecha @Andrey. La cita del Estándar publicada en la respuesta de Jonathan permite usar 'offsetof' con miembros" profundos ". – pmg