Cで静的に連想配列を生成したいんだがなんとかならんのか

仕事で

struct st{
  int id;
  int x;
  int y;
};
enum {hoge, fuga, aho, baka, end_enum};
struct st ary[] = {
  {hoge, 1,100},
  {fuga, 2,200},
  {aho, 3,300},
  {baka, 4,400}
};

って定義して、

foo(int id)
{
  for(i=0 ; i < end_enum ; i++) {
    if(ary[i].id == id) ...
  }
}

ってわざわざ線形探索してるコードが多い。enumの定義順とaryの初期値の定義順のずれを恐れてるのかなあ。
静的な連想配列を生成するマクロって作れないかなあ?

INSERT(ary, hoge, ({1,100}));
INSERT(ary, fuga, ({2,200}));
INSERT(ary, aho, ({3,300}));
INSERT(ary, baka, ({4,400}));

...
ary[fuga] // =>{2,200}

みたいに単に配列の添え字にenumを入れるだけでOKなコードを生成するマクロが欲しい。
スクリプトでコード生成するしかないかなあ。