Delphi 使用或不使用调试条件定义

Delphi 使用或不使用调试条件定义,delphi,build-process,delphi-2009,conditional-compilation,Delphi,Build Process,Delphi 2009,Conditional Compilation,在使用调试构建配置编译项目时,我有一个想法,就是在FullDebuggMode下使用FastMM4 当我选择调试构建配置时,Delphi会自动将调试设置为条件定义。因此,此代码应按预期工作: unit uXTrackUpdater; program Test; uses {$IFDEF DEBUG}FastMM4,{$ENDIF} Forms; {$R *.res} begin Application.Initialize; Application.MainFormOnT

在使用调试构建配置编译项目时,我有一个想法,就是在FullDebuggMode下使用FastMM4

当我选择调试构建配置时,Delphi会自动将调试设置为条件定义。因此,此代码应按预期工作:

unit uXTrackUpdater;

program Test;

uses
  {$IFDEF DEBUG}FastMM4,{$ENDIF}
  Forms;

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.Title := 'Test';
  Application.CreateForm(TfrmTest, frmMain);
  Application.Run;
它是有效的。但是,当我将构建配置更改为发布配置时。此代码也可以使用!它不应该吗?因为不应该定义调试条件

那么,有人能解释一下为什么不管构建配置如何,这段代码都会执行,以及如何正确设置它(只有在使用调试配置时才会编译FastMM4)

编辑后

对于FastMM,这只是一个例子。在这里发布我的问题之前,我已经在不同的案例中进行了测试。这是:

program Project21;

{$APPTYPE CONSOLE}

uses
  {$IFDEF DEBUG} SysUtils; {$ENDIF}

begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
  except
    on E:Exception do  //should not be found after rebuilding with RELEASE build configuration
      Writeln(E.Classname, ': ', E.Message);
  end;
end.
无论构建配置如何,上面的代码都将编译。为什么?

第二次编辑后

我知道,其他人说我的例子是预期的工作。但他们不是为我工作。我已经在Delphi2010上检查过这种行为,它是相同的(仍然不工作)

也许这会有帮助:我已经用
RELEASE
替换了
DEBUG
指令,看看会发生什么。结果是
RELEASE
导致示例代码无法在两种配置中生成

第三次编辑:

我的dproj文件:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <ProjectGuid>{E9F0DC1F-23EC-46AA-97F8-68C007E77218}</ProjectGuid>
        <ProjectVersion>12.0</ProjectVersion>
        <MainSource>Project21.dpr</MainSource>
        <Config Condition="'$(Config)'==''">Debug</Config>
        <DCC_DCCCompiler>DCC32</DCC_DCCCompiler>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
        <Base>true</Base>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_1)'!=''">
        <Cfg_1>true</Cfg_1>
        <CfgParent>Base</CfgParent>
        <Base>true</Base>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_2)'!=''">
        <Cfg_2>true</Cfg_2>
        <CfgParent>Base</CfgParent>
        <Base>true</Base>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Base)'!=''">
        <DCC_DependencyCheckOutputName>Project21.exe</DCC_DependencyCheckOutputName>
        <DCC_ImageBase>00400000</DCC_ImageBase>
        <DCC_UnitAlias>WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;$(DCC_UnitAlias)</DCC_UnitAlias>
        <DCC_Platform>x86</DCC_Platform>
        <DCC_E>false</DCC_E>
        <DCC_N>false</DCC_N>
        <DCC_S>false</DCC_S>
        <DCC_F>false</DCC_F>
        <DCC_K>false</DCC_K>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Cfg_1)'!=''">
        <DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
        <DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
        <DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
        <DCC_DebugInformation>false</DCC_DebugInformation>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Cfg_2)'!=''">
        <DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
    </PropertyGroup>
    <ItemGroup>
        <DelphiCompile Include="Project21.dpr">
            <MainSource>MainSource</MainSource>
        </DelphiCompile>
        <BuildConfiguration Include="Base">
            <Key>Base</Key>
        </BuildConfiguration>
        <BuildConfiguration Include="Debug">
            <Key>Cfg_2</Key>
            <CfgParent>Base</CfgParent>
        </BuildConfiguration>
        <BuildConfiguration Include="Release">
            <Key>Cfg_1</Key>
            <CfgParent>Base</CfgParent>
        </BuildConfiguration>
    </ItemGroup>
    <Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/>
    <ProjectExtensions>
        <Borland.Personality>Delphi.Personality.12</Borland.Personality>
        <Borland.ProjectType/>
        <BorlandProject>
            <Delphi.Personality>
                <Source>
                    <Source Name="MainSource">Project21.dpr</Source>
                </Source>
                <Parameters>
                    <Parameters Name="UseLauncher">False</Parameters>
                    <Parameters Name="LoadAllSymbols">True</Parameters>
                    <Parameters Name="LoadUnspecifiedSymbols">False</Parameters>
                </Parameters>
                <VersionInfo>
                    <VersionInfo Name="IncludeVerInfo">False</VersionInfo>
                    <VersionInfo Name="AutoIncBuild">False</VersionInfo>
                    <VersionInfo Name="MajorVer">1</VersionInfo>
                    <VersionInfo Name="MinorVer">0</VersionInfo>
                    <VersionInfo Name="Release">0</VersionInfo>
                    <VersionInfo Name="Build">0</VersionInfo>
                    <VersionInfo Name="Debug">False</VersionInfo>
                    <VersionInfo Name="PreRelease">False</VersionInfo>
                    <VersionInfo Name="Special">False</VersionInfo>
                    <VersionInfo Name="Private">False</VersionInfo>
                    <VersionInfo Name="DLL">False</VersionInfo>
                    <VersionInfo Name="Locale">1045</VersionInfo>
                    <VersionInfo Name="CodePage">1250</VersionInfo>
                </VersionInfo>
                <VersionInfoKeys>
                    <VersionInfoKeys Name="CompanyName"/>
                    <VersionInfoKeys Name="FileDescription"/>
                    <VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys>
                    <VersionInfoKeys Name="InternalName"/>
                    <VersionInfoKeys Name="LegalCopyright"/>
                    <VersionInfoKeys Name="LegalTrademarks"/>
                    <VersionInfoKeys Name="OriginalFilename"/>
                    <VersionInfoKeys Name="ProductName"/>
                    <VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys>
                    <VersionInfoKeys Name="Comments"/>
                </VersionInfoKeys>
            </Delphi.Personality>
        </BorlandProject>
        <ProjectFileVersion>12</ProjectFileVersion>
    </ProjectExtensions>
</Project>

{E9F0DC1F-23EC-46AA-97F8-68C007E77218}
12
Project21.dpr
调试
DCC32
真的
真的
基础
真的
真的
基础
真的
Project21.exe
00400000
WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE$(DCC_UnitAlias)
x86
假的
假的
假的
假的
假的
假的
释放$(DCC_定义)
0
假的
调试$(DCC_定义)
主要来源
基础
Cfg_2
基础
Cfg_1
基础
Delphi.Personality.12
Project21.dpr
假的
真的
假的
假的
假的
1.
0
0
0
假的
假的
假的
假的
假的
1045
1250
1.0.0.0
1.0.0.0
12

谢谢。

使用条件编译时,请确保始终在切换配置后进行生成。显然,当前的“defines”集合不是用于测试某个单元是否需要重新编译的密钥的一部分。如果您所更改的只是一个define(即:不再定义DEBUG),那么编译器根本不知道它,而是继续使用预编译单元


但由于这是关于FastMM4的,所以还有另一种方法:您可以为调试和发布定义
installOnlyFrunningINIDE
,除非您是从IDE运行,否则FastMM4不会安装它的内存管理器


编辑
考虑到您稍后的编辑,我认为您的项目的配置是罪魁祸首,因为IFDEF的工作很好。检查配置选项的两个分支,确保没有为发布和调试定义“调试”。

显示调试是在基本配置上定义的(基本配置应具有公共编译设置)。更改基准时,所有未修改的设置默认为基准值


验证您是否无意中将调试放在基本配置而不是调试配置上。

当然它“起作用”。有什么不工作的?或者您的意思是“它甚至在发布版本中也包含FastMM4”?如果您的项目中不包含FastMM4,Delphi将使用它自己的默认内存管理器。因此,代码也在发行版中运行。您的第二个代码示例显然不适用于所有构建配置。请复制并粘贴您编译并确认的真实代码,以表示您对其所做的声明。@Rob这是真实代码。为什么我要提交不同的东西?这段代码在Delphi2009上的两种配置中都适用。如果这是真的,那么这两种配置都定义了调试。如果没有定义DEBUG,就会出现语法错误,
使用的
子句中没有任何单位,没有分号。
installOnlyFrunningINIDE
可能很有用,但我从不使用它,因为我想在调试版本中获得泄漏检测等,即使我没有附加调试程序。我总是在切换配置后重建项目。我已经更新了qestion。@Cosmin,关于您的编辑:我已经检查过几次了。另外,我在基本配置中没有任何条件定义。谢谢,但我在基本配置中没有任何条件定义。好吧,我这么说是因为它发生在我身上,几个月前。