22

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

4

4 回答 4

33

用这个:

{$IFDEF DEBUG}
...
{$ENDIF}
于 2008-09-29T06:38:19.687 回答
8

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

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

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

 {$IFDEF CONDITIONALEXPRESSIONS}

这有几种用途。

例如,您可以检查 RTL 的版本;从德尔福帮助:

您可以在 $IF 表达式中使用 RTLVersion 来独立于编译器版本级别测试运行时库版本级别。
示例:{$IF RTLVersion >= 16.2} ... {$IFEND}

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

CompilerVersion 在编译系统单元时由编译器分配一个值。它指示编译器功能/语言语法的修订级别,可以独立于 RTLVersion 前进。CompilerVersion 可以在 $IF 表达式中进行测试,并且应该使用而不是测试 VERxxx 条件定义。始终测试大于或小于已知修订级别。测试特定的修订级别是个坏主意。

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

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

希望这可以帮助!

于 2008-09-29T07:54:09.863 回答
8

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

ReportMemoryLeaksOnShutdown := DebugHook <> 0; // show memory leaks when debugging
于 2009-10-15T14:06:26.760 回答
3

这些控制指令可用:

{$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;
于 2008-09-30T13:36:34.617 回答