【问题标题】:Why is my {$IFDEF DEBUG} conditional not working in Delphi?为什么我的 {$IFDEF DEBUG} 条件在 Delphi 中不起作用?
【发布时间】:2014-04-15 23:17:09
【问题描述】:

我在 Delphi 7 项目中有以下代码(更改了 IP 地址)。

const
{$IFNDEF DEBUG}
    AUTHENTICATOR_DB_ADMIN_HOST = '123.456.789.12';
{$ELSE}
    AUTHENTICATOR_DB_ADMIN_HOST = '127.0.0.1';
{$ENDIF}

在项目选项下:

  • 在标记为“条件”部分下的“目录/条件”选项卡中,我有一个定义:“DEBUG”。
  • 在标记为“模块属性”部分下的“版本信息”选项卡中,我勾选了标记为“调试-构建”的复选框。

在上面的代码示例中,“DEBUG”符号没有定义,所以IP地址设置为123.456.789.12而不是127.0.0.1我做错了什么?

这个问题来自Does Delphi's conditional compilation allow the defined symbols to contain values?

【问题讨论】:

  • 您的项目管理器中的构建配置是否设置为调试?我刚刚发现它是 Delphi 7。您可以查看这个问题以在 Delphi 7 stackoverflow.com/questions/176159/… 中切换。
  • 在 Delphi 2007 和 XE5 上对我来说很好。我不记得 Delphi 7 是否支持构建配置;如果是这样,您是否使用调试配置?
  • 版本信息无关紧要。项目选项中的条件定义就足够了。 构建您的项目以防万一。您还可以插入 {$DEFINE DEBUG} 使其仅以特定单位定义
  • 我不相信 D7 有构建配置,但也许我只是没有看到它。
  • @user - D7 没有构建配置。阅读第一条评论的第一句话。

标签: delphi debugging preprocessor delphi-7 conditional-compilation


【解决方案1】:

如果您编译您的项目并且没有任何更改,并且 DCU 在最后一个非调试版本的路径上可用,那么它将被使用,从而导致此问题。还要确保该单元包含在 DPR 的使用条款中。

如果您构建项目,它将强制重新编译添加到项目中的所有单元。

我通常为语法编译,但总是为测试/部署而编译。

【讨论】:

  • 是的,但实际上 DPR uses 子句不是必需的。在 make 模式下(-m,默认)编译器通过比较 FileAge(sourcefile)FileAge(dcubinary) 来检查 DCU 是否是最新的。因此编译器不会感知对条件的任何更改(-dSYM 开关)。
  • @Free Compiler 必须检查的不止这些。它必须重新编译依赖于自 dcu 制作以来具有接口修改的单元的任何单元。
  • @Free,是的,但如果需要重新编译作为项目的一部分,我通常会将单元添加到 DPR,它还有助于避免杂散 dcu 问题,其中编译的 dcu 可能来自另一个项目最终与我认为我正在构建的内容发生冲突。
  • @DavidHeffernan,是的,但是 AFAIK DCU 对象没有关于其编译条件符号的记录。因此,假设它们都是最新的,仍然无法区分 dcc -dFOO faux.pasdcc -dBAR faux.pas 的结果目标文件。
【解决方案2】:

我知道的老问题,但这是我的答案。在 Delphi 2010(毫无疑问是其他版本)中,DEBUG 条件由配置管理器设置,它本来就是一个保留字。

考虑这个简单的例子:-

program Buggy;

{$APPTYPE CONSOLE}

uses
  SysUtils;

begin
{$IFDEF DEBUG}
  WriteLn('DEBUG condition is ON.');
{$ELSE}
  WriteLn('DEBUG condition is OFF.');
{$ENDIF}
{$IFDEF RELEASE}
  WriteLn('RELEASE condition is ON.');
{$ELSE}
  WriteLn('RELEASE condition is OFF.');
{$ENDIF}
  ReadLn;
end.

您可以通过更改编译器配置来更改这些条件的设置:-

简而言之,不要将 DEBUG 或 RELEASE 用于您自己的用途 - 为您的测试制定一个独特的指令。

尽管有其他 cmets,但我使用的条件有助于解决语法错误、较小的 exe,并防止对我不想发布的代码进行逆向工程。

【讨论】:

    【解决方案3】:

    “$IFNDEF”代替“IFDEF”(否定形式Ndef代替def)。

    【讨论】:

    • 这个答案绝不会试图回答所问的问题。
    猜你喜欢
    • 2011-06-09
    • 2018-07-21
    • 1970-01-01
    • 2015-02-28
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多