template を使って配列の要素数を得る
割と有名な手らしいので使ってみる
template <typename T, std::size_t N> char (&CountOfHelper(T (&)[N]))[N];
としておいて、後はマクロで。
#define countof(a) (sizeof(Allegro::CountOfHelper(a)))
「なるほどなー」なんだけど、残念ながら関数内ローカル構造体の配列ではコンパイルエラーだよ。
例えば次のコード。
void fun() { static struct Local { int foo; const char* bar; } sLocal[] = { {1, "One"}, {2, "Two"}, {3, "Three"}, }; const size_t n = countof(sLocal); // だめー }
さらに、関数内ローカルじゃなくても無名構造体でもコンパイルエラー。
static struct { int foo; const char* bar; } sLocal[] = { {1, "One"}, {2, "Two"}, {3, "Three"}, }; void fun() { const size_t n = countof(sLocal); // だめー }
gcc のバージョンはこれ
i686-pc-linux-gnu-gcc (GCC) 4.1.1 (Gentoo 4.1.1)