GNU/Linux >> Linux の 問題 >  >> Linux

sizeof 演算子の実装

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() を使用しようとしています 式ではエラーが発生する可能性があります。


Linux
  1. Linuxコマンドでの(!)記号または演算子の10の驚くべき不思議な使用法

  2. -eq:単項演算子が必要ですか?

  3. 7 つの強力な awk 演算子の例 (単項、2 項、算術、文字列、代入、条件付き、正規表現の awk 演算子)

  1. 7 Linux Grep OR、Grep AND、Grep NOT 演算子の例

  2. 6 Linux の Bash シェル コマンド ライン チェーン演算子

  3. Linux および gcc 4 での C++ の新しい演算子のスレッド セーフ

  1. Alibaba Dragonwell8:Alibabaでの社内OpenJDK実装

  2. Bashスクリプト:バッククォート演算子から$括弧への移動

  3. パソコン用エアギャップ実装