В настоящее время у меня есть два проекта C ++, которые имеют много одинаковых исходных файлов и файлов заголовков. Один из них — игровой сервер, другой — клиент. Некоторые из моих классов имеют функции, которые являются уникальными для клиента или сервера, и поэтому должны компилироваться только для одного из них. Однако я не уверен, как это сделать. Мои попытки до сих пор были:
С помощью #define IS_CLIENT
в Client.h (который включает в себя основную функцию) и #define IS_SERVER
в Server.h. Это не удалось, потому что другие заголовки тогда должны были #include
их (так что мне пришлось изменить все заголовки, когда я хотел что-то скомпилировать)
С помощью #include "CompileType.h"
где CompileType.h определяет либо IS_CLIENT, либо IS_SERVER. Это значительное улучшение по сравнению с предыдущим методом, но оно все равно оставляет меня меняющим файл всякий раз, когда я хочу скомпилировать.
Обе попытки использованы #ifdef
а также #endif
вокруг выбора определений функций в .cpp файлах.
Возможным решением будет #define
что-то в глобальном масштабе (так что это влияет на все исходные и заголовочные файлы), если это возможно. В настройках моей IDE (Code :: Blocks) также может быть что-то, чего я еще не видел.
Любое понимание этой проблемы будет оценено.
Лучший способ — полностью отделить ваши функциональные возможности, чтобы все «серверные» функции находились в одном или нескольких файлах, которые используются только для сервера, а все ваши «клиенты» — в его собственном файле. Итак, в основном у вас есть три каталога, один с файлами «сервера», один с файлами «клиента» и один с «общими» файлами.
С помощью #if
или же #ifdef
в исходных файлах не должно быть сделано, если только усилия, чтобы решить это действительно, действительно огромны.
Для одного проекта, над которым я работал, у нас была программа с основными функциями и несколько дополнительных модулей. Затем все файлы, принадлежащие модулю, были записаны в несколько #ifdef MODULENAME / #endif
блоков, и тогда можно было решить, какой модуль компилировать, определив MODULENAME
в масштабе проекта (в Visual Studio со списками свойств, но есть некоторые эквиваленты для блоков кода). И на диске файлы каждого модуля находились в разных папках, так что это не слишком беспорядочно, это решение также может работать для вас.