Il sizeof
operator fa parte delle specifiche del linguaggio C (e C++) ed è implementato all'interno del compilatore (il front-end). Non c'è modo di implementarlo con altri costrutti C (a meno che non si utilizzino estensioni GCC come typeof) perché può accettare tipi o espressioni come operando, senza creare alcun effetto collaterale (ad es. sizeof((i>1)?i:(1/i))
non andrà in crash quando i==0
ma la tua macro my_sizeof
andrebbe in crash con una divisione per zero). Vedi anche le linee guida per la codifica in C e wikipedia.
Dovresti capire l'aritmetica del puntatore C. Vedi ad es. questa domanda. La differenza del puntatore è espressa in elementi non in byte.
Il risultato della sottrazione del puntatore è in elementi e non in byte. Quindi la prima espressione restituisce 1
per definizione.
A parte questo, dovresti davvero usare le parentesi nelle macro:
#define my_sizeof(x) ((&x + 1) - &x)
#define my_sizeof(x) ((char *)(&x + 1) - (char *)&x)
Altrimenti tentando di usare my_sizeof()
in un'espressione può portare a errori.