Поведение общего кода

0

Я разрабатываю клиент-серверное приложение, которое включает в себя некоторые распространенные файлы для отладки. Мой запрос во время выполнения отделяет копию этого общего кода (файл отладки), назначаемого обоим модулям, или они имеют одинаковое кодовое пространство. например:

Я хочу определить тег журнала по-разному для клиента и сервера. Для этого в файле 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

Таким образом, во время рома оба флага будут включены из-за внесения изменений в файл. Не могли бы вы рассказать мне, что будет поведением и почему?

  • 0
    #elif не соответствует #ifdef . Вам нужно #elif defined .
Теги:
logging
c-preprocessor

2 ответа

2

В вашем коде,

#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 в клиентском модуле, оставьте модуль сервера в покое. Надеюсь это поможет!!

  • 0
    Спасибо Сураву за очень вежливый ответ. То есть будет отдельная копия, которая будет назначена обоим модулям, верно? в противном случае он всегда найдет CLI_LOG_TAG_ENABLE активным и всегда будет выводить команду CLIENT?
  • 0
    в make- CLI_LOG_TAG_ENABLE модуля SERVER не определяйте CLI_LOG_TAG_ENABLE . в make- CLI_LOG_TAG_ENABLE клиентского модуля определите CLI_LOG_TAG_ENABLE . Скомпилируйте два отдельных экземпляра. Правильно?
Показать ещё 1 комментарий
1

Итак, если у вас есть общий файл, который скомпилирован с 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 необходимо перекомпилировать с новым параметром, а затем ваш журнал будет ОЧЕНЬ запутанным,

Ещё вопросы

Сообщество Overcoder
Наверх
Меню