Here’s the code:
#define offset(a,b) ((int) (&( ((a*)(0)) -> b)))
Step by step, here’s what it does:
- Type-cast 0, or NULL, into a pointer of type a. So a must be a typename.
- Member-select b from that pointer. So a must be a structure typename, and b some member property.
- Take the address of b. Since the a* used points to address 0, and b is some offset above the start of the a-structure, this means you’re getting the offset of b within a plus the address of a, which is zero. That is, you get the offset of b within a.
- Typecast that number to an integer.