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

В настоящее время у меня есть два проекта 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) также может быть что-то, чего я еще не видел.

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

0

Решение

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

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

1

Другие решения

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

0

По вопросам рекламы [email protected]