Как включить что-то, если не найдено ни одного определения

Я использую следующий код в своих классах настроек, чтобы определить, что использовать. Но теперь я столкнулся с проблемой, которую я забыл скопировать правильный файл.INC в папку моего проекта, и это дает мне AV, так как ни одно из определений не найдено. Как мне убедиться, что если ни одно из определений не найдено, то U_SettingsConnIni всегда находятся в разделе использования

 uses
  Dialogs, Forms, SysUtils,
{$IFDEF SETTINGSINI}
  U_SettingsConnIni,
{$ENDIF}
{$IFDEF SETTINGSREG}
  U_SettingsConnReg,
{$ENDIF}
{$IFDEF SETTINGSXML}
  U_SettingsConnXml,
{$ENDIF}
  U_SectionNames;

3 ответа

Решение

Этот сценарий лучше подходит для более сильных $IF чем довольно ограниченный $IFDEF,

uses
  Dialogs, Forms, SysUtils,
{$IF Defined(SETTINGSREG)}
  U_SettingsConnReg,
{$ELSEIF Defined(SETTINGSXML)}
  U_SettingsConnXml,
{$ELSE}
  U_SettingsConnIni,
{$IFEND}
  U_SectionNames;

В последних версиях Delphi вы можете использовать $ENDIF здесь, а не $IFEND Если вы предпочитаете.

Если вы хотите потерпеть неудачу, если никакое условие не определено, вы можете сделать это:

uses
  Dialogs, Forms, SysUtils,
{$IF Defined(SETTINGSREG)}
  U_SettingsConnReg,
{$ELSEIF Defined(SETTINGSXML)}
  U_SettingsConnXml,
{$ELSEIF Defined(SETTINGSINI)}
  U_SettingsConnIni,
{$ELSE}
  {$Message Fatal 'Settings file format conditional must be defined'}
{$IFEND}
  U_SectionNames;

Как обычно if блоки, $ifdef поддержка директив компилятора $else, Кроме того, они могут быть вложенными.

uses
  Dialogs, Forms, SysUtils,
{$IFDEF SETTINGSREG}
  U_SettingsConnReg,
{$ELSE}
  {$IFDEF SETTINGSXML}
  U_SettingsConnXml,
  {$ELSE}
  U_SettingsConnIni,
  {$ENDIF}
{$ENDIF}
  U_SectionNames;

Альтернативный метод (не совсем отвечающий на ваш вопрос), если вы знаете, что требуется одно из определений, - убедиться, что компиляция не удалась. В вашем случае это будет:

{$IFNDEF SETTINGSINI}
{$IFNDEF SETTINGSREG}
{$IFNDEF SETTINGSXML}
This line does not compile
{$ENDIF}
{$ENDIF}
{$ENDIF}

Таким образом, если ни одно из условных определений не установлено, компилятор захлебнется This line does not compile,

Другие вопросы по тегам