Перейти к содержанию
    

Использование несуществующих дефайнов

Столкнулся с такой... проблемой:

 

Для контроля за выполнением программы в коде широко использую конструкции

#if DEBUG_MODE
printf ("10 секунд, полёт нормальный!\n");
#endif

при этом дефайн DEBUG_MODE объявлен в глобальном файле-хидере.

 

Сегодня потратил пол-дня, выясняя, почему один из модулей не шлёт отладочную информацию (грешил на то, что не вызываю его в нужном месте). Выяснилось, что из того модуля банально не видно дефайн DEBUG_MODE, и компилятор повыкидывал все printf'ы.

 

Собственно, вопрос: каким образом оформить условие, чтобы компилятор сообщал об ошибке "не знаю такого символа" ?

Можно завернуть в обычный if(), но вдруг компилятору не хватит мозгов выкинуть его в релизной ветке?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Собственно, вопрос: каким образом оформить условие, чтобы компилятор сообщал об ошибке "не знаю такого символа" ?

Переименуйте сам printf, тогда точно выругается.

 

Где-то в global.h:
#ifdef DEBUG
    #define    printf_dbg(...)    printf(__VA_ARGS__)
#else
    #define    printf_dbg(...)
#endif

В модуле:
#include "global.h"

printf_dbg("bla-bla");

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#ifndef DEBUG_MODE
#error DEBUG_MODE undefined
#endif

Тогда дебаг неотключаемый будет.

 

 

#if (DEBUG_MODE==0) // отладка отключена

#elif  (DEBUG_MODE==1) //отладка включена
else
#error DEBUG_MODE undefined
#endif

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда дебаг неотключаемый будет.

Тогда надо два символа определять:

// определение
#ifndef NDEBUG
  #define DEBUG_MODE
#endif

//проверка
#if !defined( NDEBUG ) && !defined( DEBUG_MODE ) 
  #error Achtung! DEBUG_MODE and NDEBUG both undefined
#endif

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#ifndef DEBUG_MODE
#error DEBUG_MODE undefined
#endif

#if (DEBUG_MODE == 1)
printf ("10 секунд, полёт нормальный!\n");
#endif

полёт нормальный?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда надо два символа определять:

// определение
#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

полёт нормальный?

 

Пожалуй, что так полетит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не, неправильно -так Achtung! никогда не случится:

Это решает проблему из первого сообщения:

из того модуля банально не видно дефайн DEBUG_MODE

если напутано в инклюдах, то это будет обнаружено.

 

А вообще лучше определения таких символов, управляющих отладкой, включать не в текст программы, а определять в командной строке компилятора (в опциях используемой IDE или в make-файле). Это позволяет скомпилировать Debug и Release варианты без изменений в тексте программы, просто выбирая нужный вариант.

На NDEBUG, кстати, ещё завязаны ассерты (см. assert.h), поэтому есть смысл начинать плясать от него, примерно как в моём примере было сделано.

 

update: впрочем, тогда эта проблема просто не возникнет, поскольку наличие/отсутствие NDEBUG всегда однозначно определяет Debug или Release компилируется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Цитата(Idle @ Sep 4 2012, 20:20) *

Код

#ifndef DEBUG_MODE

#error DEBUG_MODE undefined

#endif

 

Тогда дебаг неотключаемый будет.

 

Если "#Error " заменить на "#Warning" то код скомпиится и выдаст предупреждение

Но добавлять все таки лучше в командную строку или MAKE

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Собственно, вопрос: каким образом оформить условие, чтобы компилятор сообщал об ошибке "не знаю такого символа" ?

 

Для gcc это реализуется ключиком -Wundef.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Итого, моё имхо.

Методика aaarrr самая правильная. Заодно и код не загаживается постоянными #if #endif. Почему я про неё забыл, непонятно :-)

 

Добавлять в каждый файл #ifndef .. #error лениво. Если я забыл сделать #include "global.h", то и эту проверку вставить забуду.

 

И надо будет ещё раз полистать руководство от кейла на предмет аналога ключа -Wundef. В каких-то ранних версиях это было поведением по умолчанию, было удобно.

 

Ну или подумать над выносом глобальных дефайнов в настройки среды.

Правда, в одном из проектов у меня уже три таргета, различающиеся парой констант. Если туда же добавить отладку, получится шесть...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...