Использование или не использование DEBUG условного определения - PullRequest
4 голосов
/ 22 июля 2011

У меня была идея использовать FastMM4 в FullDebugMode при компиляции моего проекта с конфигурацией отладочной сборки.

Когда я выбрал конфигурацию отладочной сборки, Delphi автоматически устанавливает DEBUG в качестве условного определения.Итак, этот код должен работать как положено:

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;

И это работает.Однако, когда я изменяю конфигурацию сборки на конфигурацию выпуска.Этот код также работает!А это не должно?Так как условие DEBUG не должно быть определено.

Итак, кто-нибудь может объяснить мне, почему этот код выполняется независимо от конфигурации сборки и как правильно его настроить (таким образом, что 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.

Приведенный выше код будет компилироваться независимо от конфигурации сборки.Почему?

После второго редактирования

Я знаю, что другие говорят, что мои примеры работают как положено.Но они не работают для меня.Я проверил это поведение в Delphi 2010, и оно идентично (все еще не работает).

Может быть, это будет полезно: я заменил директиву DEBUG на RELEASE, чтобы посмотреть, что произойдет.В результате 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>

Спасибо.

Ответы [ 2 ]

6 голосов
/ 22 июля 2011

При использовании условной компиляции убедитесь, что всегда выполняете сборку после переключения конфигураций.По-видимому, текущий набор «define» не является частью ключа, который используется для проверки, нуждается ли определенная единица в перекомпиляции или нет.Если все, что вы изменили, это определение (то есть: DEBUG больше не определяется), компилятор просто не знает об этом и продолжает использовать предварительно скомпилированный модуль.

Но поскольку речь идет о FastMM4, естьДругой способ: вы можете определить InstallOnlyIfRunningInIDE как для DEBUG, так и для RELEASE, и FastMM4 не установит свой диспетчер памяти, если вы не используете IDE.


Редактировать

Учитывая вашпозднее, я полагаю, виновата конфигурация вашего проекта, потому что IFDEF работает просто отлично.Проверьте обе ветви ваших параметров конфигурации, чтобы убедиться, что «DEBUG» не определен для Release и Debug.

0 голосов
/ 22 июля 2011

Появляется, что DEBUG определен в базовой конфигурации (которая должна иметь общие настройки компиляции). При изменении базы все неизмененные параметры по умолчанию устанавливаются на базовые значения.

Убедитесь, что вы случайно не включили DEBUG в базовую конфигурацию вместо конфигурации Debug.

...