Delphi #IF(DEBUG)等效吗?

时间:2020-03-06 14:51:46  来源:igfitidea点击:

是否有等效于C#if(DEBUG)编译器指令的Delphi?

解决方案

用这个:

{$IFDEF DEBUG}
...
{$ENDIF}

除了lassevk所说的以外,我们还可以使用其他一些编译器评估方法(自Delphi 6起,我相信):

{$IF NOT DECLARED(SOME_SYMBOL)} 
  // Mind you : The NOT above is optional
{$ELSE}
{$IFEND}

要检查编译器是否具有此功能,请使用:

{$IFDEF CONDITIONALEXPRESSIONS}

有几种用途。

例如,我们可以检查RTL的版本。从Delphi帮助中:

You can use RTLVersion in $IF
  expressions to test the runtime
  library   version level independently
  of the compiler version level.

  Example:  {$IF RTLVersion >= 16.2} ...
  {$IFEND}

同样,可以再次从代码中检查编译器版本本身:

CompilerVersion is assigned a value by
  the compiler when   the system unit is
  compiled.  It indicates the revision
  level of the   compiler features /
  language syntax, which may advance
  independently of   the RTLVersion. 
  CompilerVersion can be tested in $IF
  expressions and   should be used
  instead of testing for the VERxxx
  conditional define.   Always test for
  greater than or less than a known
  revision level.   It's a bad idea to
  test for a specific revision level.

我经常做的另一件事是在尚未定义符号时进行定义(前向兼容性很好),如下所示:

{$IF NOT DECLARED(UTF8String)}
 type
   UTF8String = type AnsiString;
 {$IFEND}

希望这可以帮助!

这些控制指令可用:

{$IFDEF}
{$ELSE}
{$ENDIF}
{$IFNDEF} //if *not* defined

它们可以按如下所示使用:

procedure TfrmMain.Button1Click(Sender: TObject);
begin
  {$IFDEF MY_CONDITIONAL}
  ShowMessage('my conditional IS defined!');
  {$ELSE}
  ShowMessage('my conditional is NOT defined!');
  {$ENDIF}

  {$IFNDEF MY_CONDITIONAL}
  ShowMessage('My conditional is explicitly NOT defined');
  {$ENDIF}
end;

如果应用程序在IDE调试器下运行,则会设置DebugHook。与编译器指令不同,但仍然非常有用。例如:

ReportMemoryLeaksOnShutdown := DebugHook <> 0; // show memory leaks when debugging