Le sizeof
L'opérateur fait partie de la spécification du langage C (et C++) et est implémenté à l'intérieur du compilateur (le frontal). Il n'y a aucun moyen de l'implémenter avec d'autres constructions C (sauf si vous utilisez des extensions GCC comme typeof) car il peut accepter des types ou des expressions comme opérande, sans faire d'effet secondaire (par exemple sizeof((i>1)?i:(1/i))
ne plantera pas lorsque i==0
mais ta macro my_sizeof
planterait avec une division par zéro). Voir également les directives de codage C et wikipedia.
Vous devez comprendre l'arithmétique du pointeur C. Voir par ex. cette question. La différence de pointeur est exprimée en éléments et non en octets.
Le résultat de la soustraction du pointeur est en éléments et non en octets. Ainsi, la première expression vaut 1
par définition.
Ceci mis à part, vous devriez vraiment utiliser des parenthèses dans les macros :
#define my_sizeof(x) ((&x + 1) - &x)
#define my_sizeof(x) ((char *)(&x + 1) - (char *)&x)
Sinon, essayez d'utiliser my_sizeof()
dans une expression peut conduire à des erreurs.