2011-08-24 12 views
5

Voglio l'offsetof() della riga param in mystruct1. Ho provatoCome si usa offsetof() su una struct?

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

e anche

offsetof(struct mystruct1, line) 

ma né opere.

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

Non puoi fornirci codice compilabile per le definizioni della struttura?O omettere 'struct mystruct2' ... –

+0

cosa intendi con" né funziona "? –

risposta

7

Il offsetof() macro accetta due argomenti. Lo standard C99 dice (in §7.17 <stddef.h>):

offsetof(type, member-designator) 

che si espande un'espressione costante intera che ha tipo size_t, il valore di che è l'offset in byte, all'elemento di struttura (designato dal member-designator), dall'inizio della sua struttura (designata per tipo). Il tipo e membro designatore deve essere tale dato

static type t; 

allora l'espressione &(t.member-designator) dà come risultato una costante indirizzo.

Quindi, è necessario scrivere:

offsetof(struct mystruct1, u_line.line); 

Tuttavia, possiamo osservare che la risposta sarà pari a zero in quanto mystruct1 contiene un union come il primo membro (e unico), e la line parte di è un elemento dell'unione, quindi sarà a offset 0.

+0

Grazie, ha funzionato bene, ottima spiegazione! – ken

0

tuo struct mystruct1 ha 1 membro denominato u_line. Si può vedere l'offset del membro

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

o di membri su tutta la linea se si specifica ogni "livello di genitorialità"

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

In primo luogo, AFAIK, offsetof deve essere utilizzato solo con membri immediati della struttura (sono proprio su questo?).

In secondo luogo, conoscere i dettagli interni dei popolari offsetof implementazioni posso suggerire cercando

offsetof(struct mystruct1, u_line.line) 

Questo dovrebbe funzionare. Se è conforme allo standard è una domanda aperta per me.

P.S. A giudicare dalla risposta di @Jonathan Leffler, questo dovrebbe funzionare.

+0

"ho ragione su questo?" Io non la penso così (dopo aver provato gcc). gcc accetta membri "profondi" nelle espressioni 'offsetof'. – pmg

+1

@pmg: Beh, a domande come questa non si può rispondere con "testing". – AnT

+0

Right @Andrey. La citazione dallo Standard pubblicata nella risposta di Jonathan consente di usare 'offsetof' con membri" profondi ". – pmg