【问题标题】:Delphi #IF(DEBUG) equivalent?Delphi #IF(DEBUG) 等效?
【发布时间】:2010-09-13 22:42:55
【问题描述】:

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

【问题讨论】:

    标签: delphi compiler-directives


    【解决方案1】:

    使用这个:

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

    【讨论】:

    • 并确保项目选项定义了调试。我认为只有较新的 Delphi(D2007 及更高版本?)默认将其设置为调试版本。
    • 对于旧版本,您可以使用 {$IFOPT D+}。 'D' 是“使用调试信息编译”的编译器选项符号。 'D+' 表示只有在该选项为 ON 时才应编译后面的内容。
    • 为了更易读的 {$IFDEF DEBUG} 的可移植性,您当然可以在标准定义包含文件中包含类似 {$IFOPT C+}{$DEFINE DEBUG}{$ENDIF} 的内容(在与不为您自动定义 DEBUG 的 Delphi 版本有关。但是请注意,此“自动定义”并不总是可靠的。我认为 DEBUGINFO 是自动定义的,但只有在您保留默认条件的情况下才定义 DEBUG按原样构建 DEBUG(它们将 DEBUG 作为“工厂”设置包含在内,但这可以并且可能会被删除。即,在打开 Debug Info 进行构建时,它不是“内置”定义。
    • @Deltics: IFOPT C+ 在断言开启时为真,你的意思是 IFOPT D+ 吗?
    • @user205376 - 将项目选项设置为“调试”,然后删除 DEBUG 条件定义。或者,打开“调试信息”但 fail 以添加 DEBUG 条件定义。无论哪种方式,结果都是:将不会编译带有调试信息但包含在 $ifdef DEBUG 中的代码的构建。添加 DEBUG 编译器条件符号的默认定义的约定可能自 1990 年以来一直存在(但 Delphi 仅自 1995 年以来,因此如何/如果/为什么它使约定永久化完全可以掌握,并且显然存在 DEBUG 定义未连接到构建中是否存在调试信息)。
    【解决方案2】:

    除了 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} 
    

    希望这会有所帮助!

    【讨论】:

    • @user205376 :感谢您的敏锐眼光,我修正了错字。
    【解决方案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;
    

    【讨论】:

    • 你忘了{$IFOPT},它可以用来直接测试编译器设置。 {$IFOPT D+} // 在 {$IFOPT C+} 上调试信息 // 启用断言等
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      • 2018-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多