Войти
Подсказки

Автогенерация повторяющегося кода с использованием препроцессора

Автор:

Чтобы не писать по тридцать три раза  куски кода с повторяющимися элементами, а главное - уменьшить возможность ошибок при изменении таких кусков (добавлении новых элементов и т.п.) можно воспользоваться таким трюком с препроцессором.

Вместо:

char *GameClassNames[]=
{
    "Monster",
    "Missle",
    "Player",
};

//...

enum
{
    kind_Monster,
    kind_Missle,
    kind_Player,
};

//...

GameObject *CreateObject( int kind )
{
    GameObject *p = NULL;
    switch(kind)
    {
        case kind_Monster: p = new CGameMonster; break;
        case kind_Missle: p = new CGameMissle; break;
        case kind_Player: p = new CGamePlayer; break;
    }
    return p;
}

//...

Можно написать:

char *GameClassNames[]=
{
    #define GAMECLASS(name) ""#name,
    #include "classes_list"
    #undef GAMECLASS
};

...

enum
{
    #define GAMECLASS(name) kind_##name,
    #include "classes_list"
    #undef GAMECLASS
};

//...

GameObject *CreateObject( int kind )
{
    GameObject *p = NULL;
    switch(kind)
    {
      #define GAMECLASS(name) case kind_##name: p = new CGame##name; break;
      #include "classes_list"
      #undef GAMECLASS
    }
}

Где сам файл classes_list будет выглядеть так:

//Здесь описаны виды игровых объектов

GAMECLASS(Monster)
GAMECLASS(Missle)
GAMECLASS(Player)

11 ноября 2003