配列の長さを表すマクロがいくつか出回っているのを見ました。
からこの質問:
#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]))
私が知りたいのは、次のことです。
array[0]
と を使用する場合の違いは何ですか*array
?- なぜどちらかを優先する必要があるのでしょうか?
- C++ では違いがありますか?
ベストアンサー1
より優れた C バージョンを以下に示します (Google の Chromium プロジェクトより):
#define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))
これは、プレーンな配列の と同等の を使用することでarray[0]
またはバージョンを改良しますが、が をオーバーロードする C++ 型である場合はコンパイルに失敗します。*array
0[array]
array[0]
array
operator[]()
除算により、ポインタがパラメータとして渡される多くの状況 (すべてではない) で、ゼロ除算演算が発生します (これはコンパイル時の定数式であるため、コンパイル時にキャッチされる必要があります) array
。
見るC には配列の長さを返す標準関数がありますか?詳細については。
C++コードにはもっと良い選択肢があります。マクロを使わずにsizeof_arrayをコンパイルする詳細については。