9

난 그냥

program Project1; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils; 

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

을 시도하고 런타임 동안 beep 있지만에게 듣고 기대했다. 그러나 다음 테스트는 작동합니다.

if IsConsole then 
    beep; 

컴파일 타임 테스트가 작동하지 않는 이유는 무엇입니까? 내가 이해할 수있는 한 this doc에서 확실히 작동해야합니다.

답변

9

선택 링커 옵션에서 "콘솔 응용 프로그램을 생성"하는 경우 , 'CONSOLE'이 정의됩니다.

+3

오, 그래,이게 더 낫다. 하지만 왜 New/Console Application을 선택할 때이 옵션이 기본적으로 켜져 있지 않는가? –

+2

@Andreas -'$ APPTYPE CONSOLE'과 다르게, GUI 응용 프로그램을위한 링커 옵션을 선택하고 I/O를 콘솔 창으로 방향 전환 할 수 있습니다. –

+0

Sertac, 귀하의 의견을 이해할 수 없습니다. IDE가 IDE 옵션과 다른 점은 컴파일러 지시어가 CONSOLE을 자동으로 정의한다는 점을 제외하고는 어떻게됩니까? 어느 것이 든 서브 시스템이 사용할 PE 헤더를 설정하는 것인가? Andreas, 컴파일러 옵션에서 정의 된 기호 목록에 CONSOLE을 수동으로 추가하는 것을 막을 수있는 방법이 있습니까? –

3

$APPTYPE 지시어는 Win32 콘솔 또는 그래픽 UI 응용 프로그램을 생성할지 여부를 제어하지만 컴파일러 지시문이 아닙니다.

{$ifdef}{$define name} 문으로 설정된 사용자 정의 컴파일러 지시문에 대한 테스트입니다. 마찬가지로

{$define KeepDlibTempFiles} 

대신 'IsConsole'을 사용할 수 있습니다 (이미 알고있는 것처럼).

+0

나는 동의하지 않습니다. * 미리 정의 된 지시어 (예 : delphibasics.co.uk/RTL.asp?Name=$IfDef 참조) 외에 사용자 정의 지시문 *에 대한 $ IFDEF 테스트 및 CONSOLE은 docwiki.embarcadero .com/RADStudio/ko/Conditional_compilation_ (Delphi) 또한, ** 나는 ** 런타임시에 컴파일 타임 (조건부 컴파일)에서 체크를하고 싶다. (거의 항상 시간 낭비이다. 오히려 드물게 런타임 중 GUI 응용 프로그램으로 변경됩니다 ...). –

+1

@Andreas Rejbrand : 예,하지만 델파이 도움말 파일은 콘솔을 미리 정의 된 컴파일러 지시어로 언급하지 않습니다. – Edelcom

+1

나는 "델파이 도움말 파일"로 docwiki.embarcadero.com/RADStudio/en/Conditional_compilation_(Delphi)를 고려할 것이다. –

3

그것은 * 엑 파일을 작동하지 않습니다, 그러나 그것은 단위로 OK입니다 (.DPR * 콘솔에서 MakeBeep 전화) :

unit Unit1; 

interface 

uses 
    SysUtils; 

procedure MakeBeep; 

implementation 

procedure MakeBeep; 
begin 
    {$IFDEF CONSOLE} 
    beep; 
    {$ENDIF} 
end; 
+1

사실입니다; 그것은 작동합니다. 그러나 대부분의 (작은) 델파이 콘솔 어플리케이션이 * .dpr 파일에 직접 작성 되었기 때문에 테스트가 제대로 작동하지 않는 것이 좋습니다. 글쎄, * .dpr 파일에서 당신은 아마 apptype이 무엇인지 알겠지만, 제 경우에는 다른 유닛의 인라인 프로 시저에서 조건부 컴파일을 했었습니다. 이것은 컴파일러 지시문이 나오는 한 동일한 결과를냅니다 . 이 문서화 되었습니까, 아니면 "버그"라고해야합니까? –

+0

글쎄, 나는 단지 인라이닝을 제거 할 것이다. 나는 런타임의 몇 나노초를 추가로 살 수있다. –

+0

@ Andreas Rejbrand - 문서화 된 것으로 생각하지 않습니다. 그리고 나는 컴파일러 개발자가 그것에 대해 어떻게 생각하는지 모른다. 버그 또는 기능 일까? – kludg

1

쉽게 솔루션 :

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



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

그래서 언제 당신이 응용 프로그램은 당신이 방금 {$ MakeConsoleApp을 정의} {에} 또는 변경 할 콘솔을 표시하지 만들고 싶어