C の一般的な配列の長さのマクロ? [重複] 質問する

C の一般的な配列の長さのマクロ? [重複] 質問する

配列の長さを表すマクロがいくつか出回っているのを見ました。

からこの質問:

  • #define length(array) (sizeof(array)/sizeof(*(array)))
  • #define ARRAY_LENGTH(array) (sizeof((array))/sizeof((array)[0]))
  • #define SIZE(array, type) (sizeof(array) / (sizeof(type))

そしてVisual Studioの_countof:

#define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0]))

私が知りたいのは、次のことです。

  1. array[0]と を使用する場合の違いは何ですか*array?
  2. なぜどちらかを優先する必要があるのでしょうか?
  3. C++ では違いがありますか?

ベストアンサー1

より優れた C バージョンを以下に示します (Google の Chromium プロジェクトより):

#define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))

これは、プレーンな配列の と同等の を使用することでarray[0]またはバージョンを改良しますが、が をオーバーロードする C++ 型である場合はコンパイルに失敗します。*array0[array]array[0]arrayoperator[]()

除算により、ポインタがパラメータとして渡される多くの状況 (すべてではない) で、ゼロ除算演算が発生します (これはコンパイル時の定数式であるため、コンパイル時にキャッチされる必要があります) array

見るC には配列の長さを返す標準関数がありますか?詳細については。

C++コードにはもっと良い選択肢があります。マクロを使わずにsizeof_arrayをコンパイルする詳細については。

おすすめ記事