0

我在我的设置类中使用以下代码来确定要使用什么。但是现在我遇到了一个问题,我忘记将正确的 .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;
4

3 回答 3

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;
于 2013-08-23T19:56:10.430 回答
3

就像普通if块一样,$ifdef编译器指令支持$else. 此外,它们可以嵌套。

uses
  Dialogs, Forms, SysUtils,
{$IFDEF SETTINGSREG}
  U_SettingsConnReg,
{$ELSE}
  {$IFDEF SETTINGSXML}
  U_SettingsConnXml,
  {$ELSE}
  U_SettingsConnIni,
  {$ENDIF}
{$ENDIF}
  U_SectionNames;
于 2013-08-23T16:33:26.377 回答
0

如果您知道需要其中一个定义,另一种方法(不完全回答您的问题)确保编译失败。在你的情况下,这将是:

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

这样,如果没有设置任何条件定义,编译器将阻塞This line does not compile.

于 2013-08-23T18:34:15.470 回答