Определение различных функций в зависимости от проекта

В настоящее время у меня есть два проекта C++, которые имеют много одинаковых исходных и заголовочных файлов. Один из них - игровой сервер, другой - клиент. Некоторые из моих классов имеют функции, которые являются уникальными для клиента или сервера, и поэтому должны компилироваться только для одного из них. Однако я не уверен, как это сделать. Мои попытки до сих пор были:

  1. С помощью #define IS_CLIENT в Client.h (который включает в себя основную функцию) и #define IS_SERVER в Server.h. Это не удалось, потому что другие заголовки тогда должны были #include их (поэтому мне пришлось изменить все заголовки, когда я хотел что-то скомпилировать)

  2. С помощью #include "CompileType.h" где CompileType.h определяет либо IS_CLIENT, либо IS_SERVER. Это значительное улучшение по сравнению с предыдущим методом, но оно все равно оставляет меня меняющим файл всякий раз, когда я хочу скомпилировать.

Обе попытки использованы #ifdef а также #endif вокруг выбора определений функций в.cpp файлах.

Возможным решением будет #define что-то в глобальном масштабе (так что это влияет на все исходные и заголовочные файлы), если это возможно. В настройках моей IDE (Code::Blocks) также может быть что-то, чего я еще не видел.

Любое понимание этой проблемы будет оценено.

2 ответа

Решение

Лучший способ - полностью отделить вашу функциональность, чтобы все "серверные" функции были в одном или нескольких файлах, которые используются только для сервера, а все ваши "клиенты" - в своем собственном файле. Итак, в основном у вас есть три каталога, один с файлами "сервера", один с файлами "клиента" и один с "общими" файлами.

С помощью #if или же #ifdef в исходных файлах не должно быть сделано, если только усилия, чтобы решить это действительно, действительно огромны.

Для одного проекта, над которым я работал, у нас была программа с основными функциями и несколько дополнительных модулей. Затем все файлы, принадлежащие модулю, были записаны в несколько #ifdef MODULENAME / #endif блоков, и тогда можно было решить, для какого модуля компилировать, определив MODULENAME в масштабе проекта (в Visual Studio с таблицами свойств, но есть некоторые эквиваленты для блоков кода). И на диске файлы каждого модуля находились в разных папках, так что это не слишком беспорядочно, это решение также может работать для вас.

Другие вопросы по тегам