El sizeof
El operador es parte de la especificación del lenguaje C (y C++) y se implementa dentro del compilador (el front-end). No hay forma de implementarlo con otras construcciones C (a menos que use extensiones GCC como typeof) porque puede aceptar tipos o expresiones como operandos, sin tener ningún efecto secundario (por ejemplo, sizeof((i>1)?i:(1/i))
no se bloqueará cuando i==0
pero tu macro my_sizeof
chocaría con una división por cero). Consulte también las pautas de codificación C y wikipedia.
Debe comprender la aritmética de punteros C. Véase, por ejemplo. esta pregunta. La diferencia de puntero se expresa en elementos, no en bytes.
El resultado de la resta del puntero está en elementos y no en bytes. Por lo tanto, la primera expresión se evalúa como 1
por definición.
Aparte de esto, deberías usar paréntesis en las macros:
#define my_sizeof(x) ((&x + 1) - &x)
#define my_sizeof(x) ((char *)(&x + 1) - (char *)&x)
De lo contrario, intentar usar my_sizeof()
en una expresión puede dar lugar a errores.