2008-09-29 87 views

回答

24

使用此:

{$IFDEF DEBUG} 
... 
{$ENDIF} 
+0

并确保项目选项定义DEBUG。我认为只有较新的Delphi(D2007及更高版本)版本会将其默认设置为调试版本。 – 2008-09-29 07:49:38

+4

对于旧版本,您可以使用{$ IFOPT D +}。 'D'是“编译调试信息”的编译器选项符号。'D +'表示如果该选项为* ON *,那么应该只编译后面的内容。 – Deltics 2010-01-09 21:52:52

+1

为了提高可读性{$ IFDEF DEBUG}的可移植性,您当然可以在标准定义包含文件中包含{$ IFOPT C +} {$ DEFINE DEBUG} {$ ENDIF}之类的内容(在与Delphi版本相关的章节中,不要自动为你定义DEBUG,但请注意,这个“自动定义”并不总是可靠的。DEBUGINFO我认为是自动定义的,但DEBUG仅在DEBUG构建的默认条件为原样时才被定义(它们是包括DEBUG作为一个“工厂”设置,但是这个可以并且可以被删除,也就是说,当构建调试信息时,它不是一个“内置”定义。 – Deltics 2010-01-09 21:56:07

7

除了什么lassevk说,你也可以使用编译器评价的其他一些方法(因为德尔福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} 

希望这有助于!

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; 
5

DebugHook设定应用程序是否在IDE调试器下运行。不同于编译器指令,但仍然非常有用。例如:

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