【发布时间】:2010-09-13 22:42:55
【问题描述】:
是否有与 C# #if(DEBUG) 编译器指令等效的 Delphi?
【问题讨论】:
标签: delphi compiler-directives
是否有与 C# #if(DEBUG) 编译器指令等效的 Delphi?
【问题讨论】:
标签: delphi compiler-directives
使用这个:
{$IFDEF DEBUG}
...
{$ENDIF}
【讨论】:
除了 lassevk 所说的,您还可以使用其他一些编译器评估方法(我相信从 Delphi 6 开始):
{$IF NOT DECLARED(SOME_SYMBOL)}
// Mind you : The NOT above is optional
{$ELSE}
{$IFEND}
要检查编译器是否具有此功能,请使用:
{$IFDEF CONDITIONALEXPRESSIONS}
这有多种用途。
例如,您可以检查 RTL 的版本;来自 Delphi 帮助:
您可以在 $IF 中使用 RTLVersion 用于测试运行时的表达式 库版本级别独立 编译器版本级别。
示例:{$IF RTLVersion >= 16.2} ... {$IFEND}
另外,编译器版本本身也可以通过代码检查:
CompilerVersion 被赋值 当系统单位是编译器 编译。它表示修订 编译器功能级别 / 语言语法,可能会进步 独立于 RTLVersion。 CompilerVersion 可以在 $IF 中测试 表达式和应该使用 而不是测试 VERxxx 条件定义。总是测试 大于或小于已知 修订级别。这是一个坏主意 测试特定的修订级别。
我经常做的另一件事是在符号尚未定义时定义它(对向前兼容很好),如下所示:
{$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
【讨论】: