为什么我的{$IFDEF DEBUG}条件在Delphi中无法工作?

5

我在 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-build”的复选框。
在上述代码示例中,“DEBUG”符号未定义,因此IP地址被设置为123.456.789.12而不是127.0.0.1。请问我错在哪里?
此问题是在Delphi的条件编译是否允许定义的符号包含值?之后的继续提问。

1
你的项目管理器中的构建配置设置为调试了吗?我刚刚发现它是Delphi 7。你可以查看这个问题,了解在Delphi 7中切换的方法:https://dev59.com/dnVC5IYBdhLWcg3w0EoD。 - Graymatter
对我来说,在Delphi 2007和XE5上都可以正常工作。我不记得Delphi 7是否支持构建配置;如果支持,您是否使用调试配置? - Ken White
4
版本信息并不重要。在项目选项中使用条件编译就足够了。为了确保,构建你的项目。你也可以插入 {$DEFINE DEBUG} 以使其仅在特定单元中定义。 - Sertac Akyuz
我不相信D7有构建配置,但也许我只是没有看到它。 - magnus
3
@user - D7没有构建配置。请阅读第一条评论的第一句话之后的内容。 - Sertac Akyuz
显示剩余3条评论
3个回答

9

如果您编译项目时没有进行更改,并且最后一个非调试版本的DCU可在路径中使用,则会使用该版本,从而导致此问题。还要确保在DPR的uses子句中包含此单元。

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

我通常为语法编译,但始终为测试/部署构建。


是的,但实际上 DPR 使用子句并不必要。在制作模式(-m,默认)下,编译器通过比较 FileAge(sourcefile)FileAge(dcubinary) 来检查 DCU 是否为最新版本。因此,编译器将无法感知对条件语句(-dSYM 开关)所做的任何更改。 - Free Consulting
1
@Free Compiler需要检查更多内容。它必须重新编译任何依赖于自从dcu被创建以来接口发生修改的单元的单元。 - David Heffernan
@Free,确实如此,但通常如果需要作为项目的一部分重新编译,则我会将单位添加到DPR中,这也有助于避免偏离dcu问题,其中从另一个项目编译的dcu可能会与我认为正在构建的内容发生冲突。 - skamradt
@DavidHeffernan,是的,但据我所知,DCU对象没有关于其编译条件符号的记录。因此,仍然无法区分使用dcc -dFOO faux.pasdcc -dBAR faux.pas编译的结果对象文件,假设它们都是最新的。 - Free Consulting

0

虽然这是一个老问题,但对我来说这就是答案。在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.

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

Project / Configuration Manager

简而言之,不要将DEBUG或RELEASE用于自己的使用-为测试编写一个独特的指令。
尽管有其他评论,我使用条件语句来帮助处理语法错误,生成较小的exe文件并防止反向工程未发布的代码。

-2

"$IFNDEF" 而不是 "IFDEF"(否定形式为 Ndef 而不是 def)。


这个回答并没有试图回答所问的问题。 - LU RD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接