Как включить что-то, если не найдено ни одного определения
Я использую следующий код в своих классах настроек, чтобы определить, что использовать. Но теперь я столкнулся с проблемой, которую я забыл скопировать правильный файл.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
,