Я разрабатываю клиент-серверное приложение, которое включает в себя некоторые распространенные файлы для отладки. Мой запрос во время выполнения отделяет копию этого общего кода (файл отладки), назначаемого обоим модулям, или они имеют одинаковое кодовое пространство. например:
Я хочу определить тег журнала по-разному для клиента и сервера. Для этого в файле make и клиента и сервера я определил два флага CLI_LOG_TAG_ENABLE и SERVER_LOG_TAG_ENABLE. Сейчас в debug.h
//debug.h
#ifdef CLI_LOG_TAG_ENABLE
#define LOG_TAG "CLIENT"
#elif SERVER_LOG_TAG_ENABLE
#define LOG_TAG "SERVER"
#endif
Таким образом, во время рома оба флага будут включены из-за внесения изменений в файл. Не могли бы вы рассказать мне, что будет поведением и почему?
В вашем коде,
#ifdef CLI_LOG_TAG_ENABLE
#define LOG_TAG "CLIENT"
#if SERVER_LOG_TAG_ENABLE //did you mean ifdef ?
#define LOG_TAG "SERVER"
#endif
Чтобы быть на более безопасной стороне, вы можете использовать
#ifdef CLI_LOG_TAG_ENABLE
#define LOG_TAG "CLIENT"
#else
#define LOG_TAG "SERVER"
#endif
Просто определите CLI_LOG_TAG_ENABLE
в клиентском модуле, оставьте модуль сервера в покое. Надеюсь это поможет!!
CLI_LOG_TAG_ENABLE
модуля SERVER не определяйте CLI_LOG_TAG_ENABLE
. в make- CLI_LOG_TAG_ENABLE
клиентского модуля определите CLI_LOG_TAG_ENABLE
. Скомпилируйте два отдельных экземпляра. Правильно?
Итак, если у вас есть общий файл, который скомпилирован с LOG_TAG
либо установленным как "CLIENT"
или "SERVER"
, строка будет включена в источник, который использует LOG_TAG
как если бы ваш источник содержал "CLIENT"
или "SERVER"
зависимости от того, что LOG_TAG
установлен во время компиляции.
Предположим, что файл debug.h включен в myfile.c, который выглядит так:
cout << LOG_TAG << " Some debug message" << endl;
то, когда myfile.c скомпилирован с параметром LOG_TAG
установленным в "SERVER"
, он будет использовать тот же код, что и вы, написав:
cout << "SERVER" << "Some debug message" << endl;
если он установлен в "CLIENT"
, код будет выглядеть так:
cout << "CLIENT" << "Some debug message" << endl;
Стоит отметить, что это происходит до того, как правильный компилятор видит код - препроцессор - это отдельный шаг (и он не имеет понятия, компилируете ли вы C, обрабатываете файл ассемблера или используете его для создания почтовых ящиков с #define NAME "Mr Mats Petersson"
и что-то вроде Dear NAME, my name is John Smith, and I'm writing to inform you that my client, a prince in my country, would like to borrow your bank account to transfer $12188138 out of the country
.)
Также важно использовать этот трюк, который вы компилируете источники в отдельный каталог, или ваша система сборки может не понимать, что файл myfile.c необходимо перекомпилировать с новым параметром, а затем ваш журнал будет ОЧЕНЬ запутанным,
#elif
не соответствует#ifdef
. Вам нужно#elif defined
.