配列の要素数を求めるのは意外と難しい
C++で配列の要素数を求める方法は大きく分けて以下の二つの方法がよく知られている。
(a)
#define SIZE(A) (sizeof(A)/sizeof(A[0]))
(b)
char (*sizehelper(T (&)[N]))[N] { return static_cast<char(*)[N]>(0); } #define SIZE(A) (sizeof(*sizehelper(A)))
どちらの方法も、遭遇することは希であるが短所をもっている。
(a)の短所
- ポインタを渡したとき、誤動作する。
- 除算が含まれているため、サイズの0の型には使えない。
(b)の短所
- 局所クラスや無名の型の配列には使えない。
- 可変長配列には使えない。
(a)の後者の短所には、少々、解説が必要かもしれない。
標準C++には、サイズ0の型なんて存在しないため、通常、これは問題にならないが、
GCCには、サイズが0の型が存在する。
struct hoge { int a[]; };
まぁ、C++でC99のフレキシブル配列メンバなんてものを使う方が間違っているんだが。
あ、(b)の後者の短所も、C99の機能か。
(a)の後者の短所も(b)の後者の短所も言いがかりといわれても仕方がない。
void foo() { int i = 3; struct { int hoge[]; } a[i]; // この配列の要素数を求める方法はおそらく存在しない。 }