Где я могу определить символы, протестированные с {$ IFDEF}? - PullRequest
11 голосов
/ 25 декабря 2010

Когда я использую директивы Delphi в коде, например:

{$IFDEF something}
.
.
.
{$ENDIF}

Где мне назначить слово «что-то» в проекте? Я пробовал в некоторых местах варианты проекта, но это не сработало. Думаю, я не нашел правильного.

Ответы [ 5 ]

16 голосов
/ 25 декабря 2010

Он находится в слоте Conditional Defines в Project | Опции, которые выглядят так на D2010:

Delphi Project Options dialog

13 голосов
/ 26 декабря 2010

Другие ответы указывали на места для определения символов и последствий для различных подходов.

Однако никто еще не упомянул, что, если вы измените символы DEFINE, вы ДОЛЖНЫ сделатьПОЛНАЯ СТРОИТЕЛЬСТВО вашего проекта, чтобы они оказали какое-либо влияние на ваш код.

Когда вы «Компилируете», компилятор Delphi компилирует только те модули, которые сами изменились со времени предыдущей компиляции.Если вы измените символы DEFINE, это не изменит какие-либо единицы проекта, поэтому, если эти единицы не будут перекомпилированы, то изменение символов DEFINE не будет иметь НИКАКОГО эффекта в этих единицах.чтобы применяться во ВСЕХ единицах, вы ДОЛЖНЫ «строить», а не компилировать.

Это может объяснить, почему ваша попытка установить определения не работала раньше

12 голосов
/ 25 декабря 2010

Вы также можете определить их в директивах {$ DEFINE }.Какие изменения это сфера.Когда вы определяете в условных определениях в опциях проекта, область действия является глобальной для всего проекта.Директивы $ DEFINE действительны только с момента их объявления до конца текущего модуля или до тех пор, пока не встретится директива $ UNDEF, использующая тот же .Что использовать, зависит от ваших потребностей и от того, что делает IFDEF.

9 голосов
/ 26 декабря 2010

Есть два места, где вы можете поместить условные определения, которые используются во всех единицах проекта:

  1. в опциях проекта (как уже сказал Дэвид Хеффернан)
  2. во включаемом файле, который включен в все этих единиц

Почему я упоминаю второй вариант? Потому что он позволяет специализированную обработку на основе условного определения VERxxx и других условных определений, приведенных в 1. См. Пример jedi.inc (из JCL Jedi).

Также, как сказал Делтикс: Когда он определяет, какие модули перекомпилировать, компилятор только проверяет, изменился ли сам модуль, а не изменились ли условные определения или какие-либо включаемые файлы. Поэтому, если вы изменяете условные определения, вы должны выполнить пересборку, а не просто перекомпиляцию. Поскольку компилятор Delphi очень быстрый, к счастью, это не имеет большого значения для времени компиляции.

6 голосов
/ 16 апреля 2014

Вы можете определить глобальные символы во внешнем файле с расширением .inc. Создайте новый текстовый файл, вставьте в него все, что вы определили, и сохраните его, как, например, Predefines.inc:

--- Содержимое файла Predefines.inc ---

{$DEFINE Symbol}
{$IFDEF Symbol}
  {$DEFINE AnotherSymbol}
{$ENDIF}

В ваших модулях Delphi, где вам нужно проверить, определены ли символы, поместите этот код в раздел интерфейса:

interface

{$I Predefines.inc}

uses ...

// Check you defines

{$IFDEF Symbol}
...
{$ENDIF}
...