D 프로그래밍-조건부 컴파일

조건부 컴파일은 C 및 C ++의 #if / #else / #endif와 유사하게 컴파일 할 코드와 컴파일하지 않을 코드를 선택하는 프로세스입니다. 여전히 컴파일되지 않은 문은 구문 상 정확해야합니다.

조건부 컴파일에는 컴파일 타임에 평가할 수있는 조건 검사가 포함됩니다. if, for, while과 같은 런타임 조건문은 조건부 컴파일 기능이 아닙니다. D의 다음 기능은 조건부 컴파일을위한 것입니다.

  • debug
  • version
  • 정적 경우

D의 디버그 문

디버그 프로그램 개발시 유용합니다. 디버그로 표시된 식과 문은 -debug 컴파일러 스위치가 활성화 된 경우에만 프로그램으로 컴파일됩니다.

debug a_conditionally_compiled_expression;
   
debug { 
   // ... conditionally compiled code ... 
} else { 
   // ... code that is compiled otherwise ... 
}

else 절은 선택 사항입니다. 위의 단일 표현식과 코드 블록은 모두 -debug 컴파일러 스위치가 활성화 된 경우에만 컴파일됩니다.

완전히 제거되는 대신 줄을 디버그로 표시 할 수 있습니다.

debug writefln("%s debug only statement", value);

이러한 행은 -debug 컴파일러 스위치가 활성화 된 경우에만 프로그램에 포함됩니다.

dmd test.d -oftest -w -debug

D의 디버그 (태그) 문

디버그 명령문에는 프로그램에 선택적으로 포함될 이름 (태그)이 주어질 수 있습니다.

debug(mytag) writefln("%s not found", value);

이러한 행은 -debug 컴파일러 스위치가 활성화 된 경우에만 프로그램에 포함됩니다.

dmd test.d -oftest -w -debug = mytag

디버그 블록에도 태그가있을 수 있습니다.

debug(mytag) { 
   //  
}

한 번에 둘 이상의 디버그 태그를 활성화 할 수 있습니다.

dmd test.d -oftest -w -debug = mytag1 -debug = mytag2

D의 디버그 (레벨) 문

때로는 숫자 수준으로 디버그 문을 연결하는 것이 더 유용합니다. 레벨을 높이면 더 자세한 정보를 제공 할 수 있습니다.

import std.stdio;  

void myFunction() { 
   debug(1) writeln("debug1"); 
   debug(2) writeln("debug2");
}

void main() { 
   myFunction(); 
}

지정된 수준보다 낮거나 같은 디버그 식 및 블록이 컴파일됩니다.

$ dmd test.d -oftest -w -debug = 1 
$ ./test 
debug1

D의 버전 (태그) 및 버전 (레벨) 문

버전은 디버그와 유사하며 동일한 방식으로 사용됩니다. else 절은 선택 사항입니다. 버전은 기본적으로 디버그와 동일하게 작동하지만 별도의 키워드를 사용하면 관련없는 용도를 구분하는 데 도움이됩니다. 디버그와 마찬가지로 둘 이상의 버전을 활성화 할 수 있습니다.

import std.stdio;  

void myFunction() { 
   version(1) writeln("version1"); 
   version(2) writeln("version2");     
}
  
void main() { 
   myFunction(); 
}

지정된 수준보다 낮거나 같은 디버그 식 및 블록이 컴파일됩니다.

$ dmd test.d -oftest -w -version = 1 
$ ./test 
version1

정적 경우

정적 if는 if 문에 해당하는 컴파일 시간입니다. if 문과 마찬가지로 static if는 논리식을 받아 평가합니다. if 문과 달리 정적 if는 실행 흐름에 관한 것이 아닙니다. 오히려 프로그램에 코드를 포함할지 여부를 결정합니다.

if 표현식은 구문 적으로나 의미 적으로 앞에서 본 is 연산자와 관련이 없습니다. 컴파일 타임에 평가됩니다. 0 또는 1의 int 값을 생성합니다. 괄호 안에 지정된 식에 따라 다릅니다. 사용하는 표현식은 논리 표현식이 아니지만 is 표현식 자체는 컴파일 시간 논리 표현식으로 사용됩니다. 특히 정적 if 조건 및 템플릿 제약 조건에서 유용합니다.

import std.stdio;

enum Days { 
   sun, 
   mon, 
   tue, 
   wed, 
   thu, 
   fri, 
   sat 
}; 
 
void myFunction(T)(T mytemplate) {
   static if (is (T == class)) { 
      writeln("This is a class type"); 
   } else static if (is (T == enum)) { 
      writeln("This is an enum type"); 
   } 
}
  
void main() { 
   Days day; 
   myFunction(day); 
}

컴파일하고 실행하면 다음과 같은 출력이 표시됩니다.

This is an enum type