#ifndef OFFSETOF_H
#define OFFSETOF_H
#include <stdio.h>
#define STR_EXPAND(tok) #tok
#define STR(tok) STR_EXPAND(tok)
#define EVAL_PRINTLN(stmt, spec) printf(STR(stmt)" = "STR(spec)"\n", stmt)
#endif
#include <stddef.h>
#include <stdio.h>
#include "offsetof.h"
struct data {
char * x;
char y;
}; // data
int main() {
EVAL_PRINTLN(sizeof(char *), %zu);
EVAL_PRINTLN(sizeof(char), %zu);
printf("\n");
EVAL_PRINTLN(sizeof(struct data), %zu);
EVAL_PRINTLN((size_t) (((struct data *) 0) + 1), %zu);
EVAL_PRINTLN((size_t) &(((struct data *) 0)[1]), %zu);
printf("\n");
EVAL_PRINTLN((size_t) &((struct data *) 0)->y, %zu);
EVAL_PRINTLN(offsetof(struct data, y), %zu);
return 0;
} // main
sizeof(char *) = 8
sizeof(char) = 1
sizeof(struct data) = 16 // why not 9!?
(size_t) (((struct data *) 0) + 1) = 16
(size_t) &(((struct data *) 0)[1]) = 16
(size_t) &((struct data *) 0)->y = 8
__builtin_offsetof (struct data, y) = 8