Der sizeof
-Operator ist Teil der C- (und C++)-Sprachspezifikation und wird im Compiler (dem Front-End) implementiert. Es gibt keine Möglichkeit, es mit anderen C-Konstrukten zu implementieren (es sei denn, Sie verwenden GCC-Erweiterungen wie typeof), da es entweder Typen oder Ausdrücke als Operanden akzeptieren kann, ohne Nebeneffekte (z. B. sizeof((i>1)?i:(1/i))
stürzt nicht ab, wenn i==0
aber Ihr Makro my_sizeof
würde bei einer Division durch Null abstürzen). Siehe auch C-Codierungsrichtlinien und Wikipedia.
Sie sollten C-Zeiger-Arithmetik verstehen. Siehe z.B. diese Frage. Die Zeigerdifferenz wird in Elementen und nicht in Bytes ausgedrückt.
Das Ergebnis der Zeigersubtraktion liegt in Elementen vor und nicht in Byte. Somit ergibt der erste Ausdruck 1
per Definition.
Abgesehen davon sollten Sie in Makros wirklich Klammern verwenden:
#define my_sizeof(x) ((&x + 1) - &x)
#define my_sizeof(x) ((char *)(&x + 1) - (char *)&x)
Andernfalls versuchen Sie, my_sizeof()
zu verwenden in einem Ausdruck kann zu Fehlern führen.