finding offset of a member in C structures
Kaleb Keithley
kaleb at thyme.jpl.nasa.gov
Tue May 21 07:23:38 AEST 1991
In article <16194 at smoke.brl.mil> gwyn at smoke.brl.mil (Doug Gwyn) writes:
>In article <1276 at unisql.UUCP> pckim at unisql.UUCP (Pyung-Chul Kim) writes:
>- struct a_struct {
>- short member1;
>- char member2;
>- int memner3;
>- };
>-can I get the offset of member2 at *compiling time* and *portably* ?
>
>Yes, but you shouldn't very often need to do so.
Opinion or Fact?
>-It is possible to provide a compiler operator:
>- offsetof(member_name,structure_type_name)
>-as it provides 'sizeof' operator.
>-Do you know if there is a compiler operator like above, or is there any
>-alternative solution.
>
>Standard C provides an offsetof() macro, but you don't really need one.
> struct a_struct foo;
> int offset2 = (char *)&foo.member2 - (char *)&foo; /* for example */
Here's how *they* do in the X Window System. I expect it's about as
portable as anything gets. This is lifted straight from Intrinsic.h.
And BTW, they use it often.
#if defined(CRAY) || defined(__arm)
#ifdef CRAY2
#define XtOffset(p_type,field) \
(sizeof(int)*((unsigned int)&(((p_type)NULL)->field)))
#else /* !CRAY2 */
#define XtOffset(p_type,field) ((unsigned int)&(((p_type)NULL)->field))
#endif /* !CRAY2 */
#else /* ! (CRAY || __arm) */
#define XtOffset(p_type,field) \
((Cardinal) (((char *) (&(((p_type)NULL)->field))) - ((char *) NULL)))
#endif /* !CRAY */
#define XtOffsetOf(s_type,field) XtOffset(s_type*,field)
#ifdef notdef
/* this doesn't work on picky compilers */
#define XtOffset(p_type,field) ((unsigned int)&(((p_type)NULL)->field))
#endif
--
Kaleb Keithley kaleb at thyme.jpl.nasa.gov
Meep Meep Roadrunner
Veep veep Quayle
More information about the Comp.lang.c
mailing list