esaulenka 7 4 сентября, 2012 Опубликовано 4 сентября, 2012 · Жалоба Столкнулся с такой... проблемой: Для контроля за выполнением программы в коде широко использую конструкции #if DEBUG_MODE printf ("10 секунд, полёт нормальный!\n"); #endif при этом дефайн DEBUG_MODE объявлен в глобальном файле-хидере. Сегодня потратил пол-дня, выясняя, почему один из модулей не шлёт отладочную информацию (грешил на то, что не вызываю его в нужном месте). Выяснилось, что из того модуля банально не видно дефайн DEBUG_MODE, и компилятор повыкидывал все printf'ы. Собственно, вопрос: каким образом оформить условие, чтобы компилятор сообщал об ошибке "не знаю такого символа" ? Можно завернуть в обычный if(), но вдруг компилятору не хватит мозгов выкинуть его в релизной ветке? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 4 сентября, 2012 Опубликовано 4 сентября, 2012 · Жалоба Собственно, вопрос: каким образом оформить условие, чтобы компилятор сообщал об ошибке "не знаю такого символа" ? Переименуйте сам printf, тогда точно выругается. Где-то в global.h: #ifdef DEBUG #define printf_dbg(...) printf(__VA_ARGS__) #else #define printf_dbg(...) #endif В модуле: #include "global.h" printf_dbg("bla-bla"); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Idle 0 4 сентября, 2012 Опубликовано 4 сентября, 2012 · Жалоба #ifndef DEBUG_MODE #error DEBUG_MODE undefined #endif Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 4 сентября, 2012 Опубликовано 4 сентября, 2012 · Жалоба #ifndef DEBUG_MODE #error DEBUG_MODE undefined #endif Тогда дебаг неотключаемый будет. #if (DEBUG_MODE==0) // отладка отключена #elif (DEBUG_MODE==1) //отладка включена else #error DEBUG_MODE undefined #endif Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 4 сентября, 2012 Опубликовано 4 сентября, 2012 · Жалоба Тогда дебаг неотключаемый будет. Тогда надо два символа определять: // определение #ifndef NDEBUG #define DEBUG_MODE #endif //проверка #if !defined( NDEBUG ) && !defined( DEBUG_MODE ) #error Achtung! DEBUG_MODE and NDEBUG both undefined #endif Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Idle 0 4 сентября, 2012 Опубликовано 4 сентября, 2012 · Жалоба #ifndef DEBUG_MODE #error DEBUG_MODE undefined #endif #if (DEBUG_MODE == 1) printf ("10 секунд, полёт нормальный!\n"); #endif полёт нормальный? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 4 сентября, 2012 Опубликовано 4 сентября, 2012 · Жалоба Тогда надо два символа определять: // определение #ifndef NDEBUG #define DEBUG_MODE #endif //проверка #if !defined( NDEBUG ) && !defined( DEBUG_MODE ) #error Achtung! DEBUG_MODE and NDEBUG both undefined #endif Не, неправильно -так Achtung! никогда не случится: так как вот это #ifndef NDEBUG #define DEBUG_MODE #endif определит DEBUG_MODE, если NDEBUG !defined. #ifndef DEBUG_MODE #error DEBUG_MODE undefined #endif #if (DEBUG_MODE == 1) printf ("10 секунд, полёт нормальный!\n"); #endif полёт нормальный? Пожалуй, что так полетит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 4 сентября, 2012 Опубликовано 4 сентября, 2012 · Жалоба Не, неправильно -так Achtung! никогда не случится: Это решает проблему из первого сообщения: из того модуля банально не видно дефайн DEBUG_MODE если напутано в инклюдах, то это будет обнаружено. А вообще лучше определения таких символов, управляющих отладкой, включать не в текст программы, а определять в командной строке компилятора (в опциях используемой IDE или в make-файле). Это позволяет скомпилировать Debug и Release варианты без изменений в тексте программы, просто выбирая нужный вариант. На NDEBUG, кстати, ещё завязаны ассерты (см. assert.h), поэтому есть смысл начинать плясать от него, примерно как в моём примере было сделано. update: впрочем, тогда эта проблема просто не возникнет, поскольку наличие/отсутствие NDEBUG всегда однозначно определяет Debug или Release компилируется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edit2007 3 5 сентября, 2012 Опубликовано 5 сентября, 2012 · Жалоба Цитата(Idle @ Sep 4 2012, 20:20) * Код #ifndef DEBUG_MODE #error DEBUG_MODE undefined #endif Тогда дебаг неотключаемый будет. Если "#Error " заменить на "#Warning" то код скомпиится и выдаст предупреждение Но добавлять все таки лучше в командную строку или MAKE Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
halfdoom 0 5 сентября, 2012 Опубликовано 5 сентября, 2012 · Жалоба Собственно, вопрос: каким образом оформить условие, чтобы компилятор сообщал об ошибке "не знаю такого символа" ? Для gcc это реализуется ключиком -Wundef. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 5 сентября, 2012 Опубликовано 5 сентября, 2012 · Жалоба Итого, моё имхо. Методика aaarrr самая правильная. Заодно и код не загаживается постоянными #if #endif. Почему я про неё забыл, непонятно :-) Добавлять в каждый файл #ifndef .. #error лениво. Если я забыл сделать #include "global.h", то и эту проверку вставить забуду. И надо будет ещё раз полистать руководство от кейла на предмет аналога ключа -Wundef. В каких-то ранних версиях это было поведением по умолчанию, было удобно. Ну или подумать над выносом глобальных дефайнов в настройки среды. Правда, в одном из проектов у меня уже три таргета, различающиеся парой констант. Если туда же добавить отладку, получится шесть... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться