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

ところで、http://docwiki.embarcadero.com/RADStudio/XE3/en/Conditional_compilation_(Delphi)によると、コンソールアプリケーションのコンパイル中に「CONSOLE」条件付きシンボルが事前定義されているため、{$IFDEFCONSOLE}は少なくともXE2とXE3で機能します。 。

XEおよびそれ以前のバージョンにはそのような情報はありません。

于 2013-01-14T07:44:09.860 に答える
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 に答える
3

ディレクティブは、Win32 コンソールまたはグラフィカル UI アプリケーションを生成するかどうかを制御します。$APPTYPEこれはコンパイラ ディレクティブではありません。

{$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 に答える