sizeof
operátor je součástí specifikace jazyka C (a C++) a je implementován uvnitř kompilátoru (front-end). Neexistuje způsob, jak jej implementovat s jinými konstrukcemi C (pokud nepoužíváte rozšíření GCC jako typeof), protože může jako operand přijímat buď typy nebo výrazy, aniž by to mělo vedlejší efekt (např. sizeof((i>1)?i:(1/i))
nezhroutí se, když i==0
ale vaše makro my_sizeof
by se zhroutil s dělením nulou). Viz také pokyny pro kódování C a wikipedii.
Měli byste rozumět aritmetice ukazatele C. Viz např. tato otázka. Rozdíl ukazatelů je vyjádřen v prvcích, nikoli v bajtech.
Výsledek odečítání ukazatele je v prvcích a ne v bajtech. První výraz se tedy vyhodnotí jako 1
podle definice.
Kromě toho byste skutečně měli v makrech používat závorky:
#define my_sizeof(x) ((&x + 1) - &x)
#define my_sizeof(x) ((char *)(&x + 1) - (char *)&x)
Jinak pokus o použití my_sizeof()
ve výrazu může vést k chybám.