offset += sizeof(struct gre_base_hdr);
 
        if (hdr->flags & GRE_CSUM)
-               offset += sizeof(((struct gre_full_hdr *) 0)->csum) +
-                         sizeof(((struct gre_full_hdr *) 0)->reserved1);
+               offset += FIELD_SIZEOF(struct gre_full_hdr, csum) +
+                         FIELD_SIZEOF(struct gre_full_hdr, reserved1);
 
        if (hdr->flags & GRE_KEY) {
                const __be32 *keyid;
                        else
                                key_keyid->keyid = *keyid & GRE_PPTP_KEY_MASK;
                }
-               offset += sizeof(((struct gre_full_hdr *) 0)->key);
+               offset += FIELD_SIZEOF(struct gre_full_hdr, key);
        }
 
        if (hdr->flags & GRE_SEQ)
-               offset += sizeof(((struct pptp_gre_header *) 0)->seq);
+               offset += FIELD_SIZEOF(struct pptp_gre_header, seq);
 
        if (gre_ver == 0) {
                if (*p_proto == htons(ETH_P_TEB)) {
                u8 *ppp_hdr;
 
                if (hdr->flags & GRE_ACK)
-                       offset += sizeof(((struct pptp_gre_header *) 0)->ack);
+                       offset += FIELD_SIZEOF(struct pptp_gre_header, ack);
 
                ppp_hdr = __skb_header_pointer(skb, *p_nhoff + offset,
                                               sizeof(_ppp_hdr),