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)