Определение различных функций в зависимости от проекта
В настоящее время у меня есть два проекта 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) также может быть что-то, чего я еще не видел.
Любое понимание этой проблемы будет оценено.
2 ответа
Лучший способ - полностью отделить вашу функциональность, чтобы все "серверные" функции были в одном или нескольких файлах, которые используются только для сервера, а все ваши "клиенты" - в своем собственном файле. Итак, в основном у вас есть три каталога, один с файлами "сервера", один с файлами "клиента" и один с "общими" файлами.
С помощью #if
или же #ifdef
в исходных файлах не должно быть сделано, если только усилия, чтобы решить это действительно, действительно огромны.
Для одного проекта, над которым я работал, у нас была программа с основными функциями и несколько дополнительных модулей. Затем все файлы, принадлежащие модулю, были записаны в несколько #ifdef MODULENAME / #endif
блоков, и тогда можно было решить, для какого модуля компилировать, определив MODULENAME
в масштабе проекта (в Visual Studio с таблицами свойств, но есть некоторые эквиваленты для блоков кода). И на диске файлы каждого модуля находились в разных папках, так что это не слишком беспорядочно, это решение также может работать для вас.