1 #include <stdio.h> 2 #include <stdint.h> 3 #include <systypes/format.h> 4 5 #define FMTsize "%" pFMTsize "d" 6 #define FMT32x "%" pFMT32 "x" 7 #define FMT64x "%" pFMT64 "x" 8 #define OFFSET(obj, mem) ((char *) &(obj)->mem - (char *) obj) 9 10 struct A 11 { 12 uint32_t a; 13 uint64_t b; 14 uint64_t c; 15 } __attribute__ ((packed)); 16 17 struct B 18 { 19 uint32_t a; 20 uint64_t b; 21 uint64_t c; 22 }; 23 24 struct C 25 { 26 uint32_t a; 27 uint32_t b; 28 uint64_t c; 29 }; 30 31 int main(int argc, char *argv[]) 32 { 33 (void) argc; (void) argv; 34 35 struct A a = {1, 2, 3}; 36 struct B b = {1, 2, 3}; 37 struct C c = {1, 2, 3}; 38 uint32_t m[6] = {1, 2, 3, 4, 5, 6}; 39 struct A *ma = (struct A *) m; 40 struct A *ma1 = (struct A *) (m + 1); 41 42 printf("a.a @ offset " FMTsize " = " FMT32x "\n", OFFSET(&a, a), a.a); 43 printf("a.b @ offset " FMTsize " = " FMT64x "\n", OFFSET(&a, b), a.b); 44 printf("a.c @ offset " FMTsize " = " FMT64x "\n\n", OFFSET(&a, c), a.c); 45 printf("b.a @ offset " FMTsize " = " FMT32x "\n", OFFSET(&b, a), b.a); 46 printf("b.b @ offset " FMTsize " = " FMT64x "\n", OFFSET(&b, b), b.b); 47 printf("b.c @ offset " FMTsize " = " FMT64x "\n\n", OFFSET(&b, c), b.c); 48 printf("c.a @ offset " FMTsize " = " FMT32x "\n", OFFSET(&c, a), c.a); 49 printf("c.b @ offset " FMTsize " = " FMT32x "\n", OFFSET(&c, b), c.b); 50 printf("c.c @ offset " FMTsize " = " FMT64x "\n\n", OFFSET(&c, c), c.c); 51 printf("ma.a @ offset " FMTsize " = " FMT32x "\n", OFFSET(ma, a), ma->a); 52 printf("ma.b @ offset " FMTsize " = " FMT64x "\n", OFFSET(ma, b), ma->b); 53 printf("ma.c @ offset " FMTsize " = " FMT64x "\n\n", OFFSET(ma, c), ma->c); 54 printf("ma1.a @ offset " FMTsize " = " FMT32x "\n", OFFSET(ma1, a), ma1->a); 55 printf("ma1.b @ offset " FMTsize " = " FMT64x "\n", OFFSET(ma1, b), ma1->b); 56 printf("ma1.c @ offset " FMTsize " = " FMT64x "\n\n", OFFSET(ma1, c), ma1->c); 57 58 return 0; 59 }