Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.03.2012, 19:37   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Смущение Не хитрые, но значимые вещи. Как обьявить логический DEFINE?

Доброго времени суток!

Стороних средств уже маловато для отладки, и есть вещи которые хочется видеть самому, в ходе разработки. Одной такой вещью, является ведение лога с параноидальным выводом всего и вся.

С этим проблем у меня не возникает, но нужно для каждого релиза лазить по коду и комментировать создание обьектов, а это уже ой как задолбало.

Часто вижу как где-то используется такие штуки как define.
Как их обьявить? И как это сделать ввиде *.inc файла?

Хотелось бы тупо ставить {$define ISDBG ON} и компилятор включал бы весь код создания моих обьектов, а при {$define ISDBG OFF} вырезал весь не нужный код.

Гугл толком ничего не дал. Пожалуйста, дайте нормальных ссылок, или сами расскажите как это делать
Человек_Борща вне форума Ответить с цитированием
Старый 08.03.2012, 20:09   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
{$define ISDBG ON}
...
{$ifdef ISDBG}
тут код который скомпилится если переменка ISDBG описана
{$elseif}
тут код который скомпилится если переменка ISDBG не описана
{$ifend}
Это вкратце, надеюсь понятно, ибо собственно и рассказывать то нечего.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.03.2012, 21:02   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

добавлю что в последних версиях есть дебаг и релиз сборки. в каждой можно определить свой набор дефайнов(в дебаге обычно сразу определен символ Debug)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.03.2012, 03:41   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

У символов условной компиляции нет состояния. Им нельзя сделать "ON", "OFF", "зелёный", "3". Их можно определить и удалить. Соответственно, произвольный символ может быть или опеределён или не определён.

Код:
{$DEFINE идентификатор} определяет новый символ условной компиляции.
{$UNDEF идентификатор} удаляет символ.

// обе эти директивы работают с момента появления в файле и ниже - до конца модуля или до следующей директивы
// т.е. {$DEFINE}, вставленный в начало файла, будет действовать на весь модуль
// обычно эти директивы вставляют до секции interface или даже до "unit"
// альтернативно, список символов можно указать в настройках проекта, на вкладке Directories/Conditionals
// это эквивалентно тому, как если бы в самом начале каждого файла появился бы {$DEFINE идентификатор}
// т.е. работает глобально на весь проект (а не на один модуль), но может отключаться локально при необходимости
// разумеется, при изменении настроек нужно делать полный Build

{$IFDEF идентификатор}
код, который будет скомпилирован только если "идентификатор" был определён выше по тексту
{$ENDIF}

{$IFNDEF идентификатор}
код, который будет скомпилирован только если "идентификатор" НЕ был определён выше по тексту
{$ENDIF}

{$IFDEF идентификатор}
код, который будет скомпилирован только если "идентификатор" был определён выше по тексту
{$ELSE}
код, который будет скомпилирован только если "идентификатор" НЕ был определён выше по тексту
{$ENDIF}
Обрати внимание, что речь идёт о компиляции. Т.е. код, обрамлённый IFDEF/IFNDEF, при невыполнении условия в программу вообще не попадёт, как будто бы его и не писали.

Поэтому, если ты хочешь включать и выключать отладочные проверки в run-time, тебе вместо символов нужно использовать обычные флажки:

Код:
if DoDebug then ...
(флажки можно включать через командную строку)

Цитата:
Как их обьявить? И как это сделать ввиде *.inc файла?
Сначала делаешь это как обычно - в тексте программы. А затем, если этого текста много - вырезаешь его, сохраняешь в файл (скажем, MyDefines.inc), а в том месте, откуда его вырезал, вставляешь {$I MyDefines.inc}

Обычно это используется, чтобы разделить сложную логику между несколькими модулями. Например, в .inc файлах могут быть такие строки:

Код:
{$IFNDEF PROFESSIONAL}
  {$IFNDEF ULTIMATE}
    {$DEFINE STANDARD}
  {$ENDIF}
{$ENDIF}

{$IFDEF STANDARD}
  {$DEFINE FEATURE_PRINT}

  {$UNDEF PROFESSIONAL}
  {$UNDEF ULTIMATE}
{$ENDIF}

{$IFDEF PROFESSIONAL}
  {$DEFINE FEATURE_COMPARE}
  {$DEFINE FEATURE_OPTIMIZE}
  {$DEFINE FEATURE_EXPORT}

  {$UNDEF STANDARD}
  {$UNDEF ULTIMATE}
{$ENDIF}

{$IFDEF ULTIMATE}
  {$DEFINE FEATURE_LANG_CHANGE}
  {$DEFINE FEATURE_GRAPHS}
  {$DEFINE FEATURE_ENCRYPTION}

  {$UNDEF STANDARD}
  {$UNDEF PROFESSIONAL}
{$ENDIF}
Тогда, в настройках программы можно будет указать STANDARD - для сборки "обычной" версии программы, PROFESSIONAL - для сборки "профессиональной" и ULTIMATE - для "максимальной".

Замечу, что в твоём случае это навряд ли пригодится, т.к. есть вполне себе стандартный символ DEBUG. Ты можешь делать {$IFDEF DEBUG}. Тебе нет необходимости расписывать это по дополнительным символам.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.

Последний раз редактировалось Stilet; 09.03.2012 в 11:58.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
#define Артэс Общие вопросы C/C++ 3 11.01.2012 19:50
обьявить програмно связь таблиц access из delphi kelod БД в Delphi 7 15.07.2010 17:53
Выделить из числа значимые восьмиричные разряды green_ Помощь студентам 2 28.10.2009 19:43
#define JOFRIF Общие вопросы C/C++ 7 21.07.2009 18:26
Как обьявить переменную типа AnsiString глобально Kocapb Общие вопросы C/C++ 6 19.12.2007 05:05