Автогенерация повторяющегося кода с использованием препроцессора
Автор: Евгения Викторовна Германова
Чтобы не писать по тридцать три раза куски кода с повторяющимися элементами, а главное - уменьшить возможность ошибок при изменении таких кусков (добавлении новых элементов и т.п.) можно воспользоваться таким трюком с препроцессором.
Вместо:
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