sizeof
operator は C (および C++) 言語仕様の一部であり、コンパイラ (フロントエンド) 内に実装されています。他の C コンストラクトで実装する方法はありません (typeof のような GCC 拡張機能を使用しない限り)。これは、型または式をオペランドとして受け入れることができ、副作用 (例:sizeof((i>1)?i:(1/i))
) を発生させないためです。 i==0
のときにクラッシュしません しかし、あなたのマクロ my_sizeof
ゼロ除算でクラッシュします)。 C コーディング ガイドラインとウィキペディアも参照してください。
C ポインター演算を理解する必要があります。例を参照してください。この質問。ポインターの違いは、バイトではなく要素で表されます。
ポインタ減算の結果は 要素 にあります バイト単位ではありません。したがって、最初の式は 1
に評価されます
これはさておき、マクロでは括弧を使用する必要があります:
#define my_sizeof(x) ((&x + 1) - &x)
#define my_sizeof(x) ((char *)(&x + 1) - (char *)&x)
それ以外の場合は my_sizeof()
を使用しようとしています 式ではエラーが発生する可能性があります。