Come si usa offsetof () su una struct?

Voglio l’offsetof () della riga param in mystruct1 . ho provato

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

e anche

 offsetof(struct mystruct1, line) 

ma nessuno dei due funziona.

 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; }; 

La macro offsetof() accetta due argomenti. Lo standard C99 dice (in §7.17 ):

 offsetof(type, member-designator) 

che si espande a un’espressione costante intera che ha tipo size_t , il cui valore è l’offset in byte, al membro della struttura (designato da member-designator), dall’inizio della sua struttura (designata dal tipo). Il tipo e la designazione del membro devono essere tali da dare

 static type t; 

quindi l’espressione &(t.member-designator) valuta una costante di indirizzo.

Quindi, è necessario scrivere:

 offsetof(struct mystruct1, u_line.line); 

Tuttavia, possiamo osservare che la risposta sarà zero poiché mystruct1 contiene union come primo membro (e solo), e la parte di line di esso è un elemento dell’unione, quindi sarà a offset 0.

Un grande articolo da leggere su questo è:

Impara un nuovo trucco con la macro offsetof ()

Uso frequentemente l’offset di macro nel mio codice incorporato, insieme alla macro SIZEOF modificata come discusso nell’articolo.

La tua struct mystruct1 ha 1 membro di nome u_line . Puoi vedere l’offset di quel membro

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

o dei membri lungo la linea se si specifica ciascun “livello di genitorialità”

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

In primo luogo, AFAIK, offsetof è destinato ad essere utilizzato solo con membri immediati della struttura (ho ragione su questo?).

In secondo luogo, conoscendo i dettagli interni delle diffuse implementazioni di offsetof posso suggerire di provare

 offsetof(struct mystruct1, u_line.line) 

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

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