sizeof
operator adalah bagian dari spesifikasi bahasa C (dan C++), dan diimplementasikan di dalam kompiler (ujung depan). Tidak ada cara untuk mengimplementasikannya dengan konstruksi C lainnya (kecuali jika Anda menggunakan ekstensi GCC seperti typeof) karena dapat menerima tipe atau ekspresi sebagai operan, tanpa membuat efek samping apa pun (mis. sizeof((i>1)?i:(1/i))
tidak akan mogok saat i==0
tapi makro Anda my_sizeof
akan crash dengan pembagian dengan nol). Lihat juga pedoman pengodean C, dan wikipedia.
Anda harus memahami aritmatika pointer C. Lihat mis. pertanyaan ini. Perbedaan penunjuk dinyatakan dalam elemen, bukan byte.
Hasil pengurangan pointer ada di elemen dan bukan dalam byte. Jadi ekspresi pertama dievaluasi menjadi 1
menurut definisi.
Selain itu, Anda benar-benar harus menggunakan tanda kurung di makro:
#define my_sizeof(x) ((&x + 1) - &x)
#define my_sizeof(x) ((char *)(&x + 1) - (char *)&x)
Kalau tidak, coba gunakan my_sizeof()
dalam ekspresi dapat menyebabkan kesalahan.