我在设置类中使用以下代码来确定要使用的内容。 但是现在我遇到了一个问题,我忘记了将正确的.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;
答案 0 :(得分:3)
就像普通的if
块一样,$ifdef
编译器指令支持$else
。此外,它们可以嵌套。
uses
Dialogs, Forms, SysUtils,
{$IFDEF SETTINGSREG}
U_SettingsConnReg,
{$ELSE}
{$IFDEF SETTINGSXML}
U_SettingsConnXml,
{$ELSE}
U_SettingsConnIni,
{$ENDIF}
{$ENDIF}
U_SectionNames;
答案 1 :(得分: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;
答案 2 :(得分:0)
另一种方法(不完全回答您的问题),如果您知道其中一个定义 ,则确保编译失败。在你的情况下:
{$IFNDEF SETTINGSINI}
{$IFNDEF SETTINGSREG}
{$IFNDEF SETTINGSXML}
This line does not compile
{$ENDIF}
{$ENDIF}
{$ENDIF}
这样,如果没有设置条件定义,编译器就会阻塞This line does not compile
。