11

我刚试过

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

begin
  {$IFDEF CONSOLE}
    beep;
  {$ENDIF}
end.

并希望beep在运行时听到 a,但不是。但是,以下测试有效:

  if IsConsole then
    beep;

为什么编译时测试不起作用?据我从这个文档中了解到的,它肯定可以工作。

4

5 回答 5

9

如果从链接器选​​项中选择“生成控制台应用程序”,则定义了“CONSOLE”。

于 2010-07-10T11:20:23.327 回答
4

它在 *.dpr 文件中不起作用,但在一个单元中是可以的(从控制台 *.dpr 调用 MakeBeep):

unit Unit1;

interface

uses
  SysUtils;

procedure MakeBeep;

implementation

procedure MakeBeep;
begin
  {$IFDEF CONSOLE}
    beep;
  {$ENDIF}
end;
于 2010-07-10T11:10:44.327 回答
4

顺便说一句,根据http://docwiki.embarcadero.com/RADStudio/XE3/en/Conditional_compilation_(Delphi)现在“CONSOLE”条件符号是在编译控制台应用程序时预定义的,因此 {$IFDEF CONSOLE} 至少适用于 XE2 和 XE3 .

XE 和旧版本没有此类信息。

于 2013-01-14T07:44:09.860 回答
3

$APPTYPE指令控制是否生成 Win32 控制台或图形 UI 应用程序,它不是编译器指令。

{$ifdef}{$define name}测试由语句设置的用户定义的编译器指令。如在

{$define KeepDlibTempFiles}

相反,可以使用“IsConsole”(正如您已经发现的那样)。

于 2010-07-10T10:57:03.010 回答
2

更简单的解决方案:

program YourProgram;
{$DEFINE MakeConsoleApp}
{$IFDEF MakeConsoleApp}
  {$APPTYPE CONSOLE}
{$ENDIF}



[....]
{$IFDEF MakeConsoleApp} WriteLn('Text in a Console'); {$ENDIF}

因此,只要您想让应用程序不显示控制台,您只需将 {$DEFINE MakeConsoleApp} 更改为 { } 或 {.$DEFINE MakeConsoleApp}

于 2011-03-15T14:25:43.833 回答