매크로 대체 (#define)

프리프로세서 명령문은 컴파일하기 전에 소스 코드를 전처리하는 데 사용됩니다. 명령문은 항상 #로 시작하므로 컴파일러는 변수, 함수 등의 이름에 기호를 사용할 수 없습니다.

각 명령문은 별도의 항목으로 설명되며 줄 바꿈까지 유효합니다. 한 항목에는 여러 명령문을 사용할 수 없습니다. 지시어 입력이 너무 크면 '\' 기호를 사용하여 여러 줄로 구분할 수 있습니다. 이 경우 다음 행은 명령문 입력의 연속으로 간주됩니다.

#define 명령문을 사용하여 니모닉 이름을 상수에 할당할 수 있습니다. 두가지 형태가 있습니다:

#define identifier expression                   // 매개 변수가 없는 포맷
#define identifier(par1,... par8) expression    // 매개변수가 있는 포맷

#define 명령문은 다음을 표현식으로 대체합니다: 원본 텍스트에서 추가로 발견된 식별자의 모든 항목. 식별자는 별도의 토큰인 경우에만 대체됩니다. 식별자는 주석, 문자열 또는 다른 긴 식별자의 일부인 경우 대체되지 않습니다.

상수 식별자는 변수 이름과 동일한 규칙에 의해 제어됩니다. 값은 모든 유형이 될 수 있습니다:

#define ABC               100
#define PI                3.14
#define COMPANY_NAME      "MetaQuotes Software Corp."
...
void ShowCopyright()
  {
   Print("Copyright  2001-2009, ",COMPANY_NAME);
   Print("https://www.metaquotes.net");
  }

표현식은 키워드, 상수, 상수 및 비변환 식과 같은 여러 토큰으로 구성될 수 있습니다. 표현식은 행의 끝으로 끝나며 다음 행으로 전송할 수 없습니다.

예제:

#define TWO        2
#define THREE      3
#define INCOMPLETE TWO+THREE
#define COMPLETE  (TWO+THREE)
void OnStart()
  {
   Print("2 + 3*2 = ",INCOMPLETE*2);
   Print("(2 + 3)*2 = ",COMPLETE*2);
  }
// 결과
// 2 + 3*2 = 8
// (2 + 3)*2 = 10

 

Parametric Form #define

파라메트릭 형태를 사용하면 이후 발견된 모든 식별자 항목이 실제 매개변수를 고려한 식으로 대체됩니다. 예:

 // 두 개의 매개 변수가 a 및 b인 예제
#define A 2+3
#define B 5-1
#define MUL(a, b) ((a)*(b))
 
double c=MUL(A,B);
Print("c=",c);
/*
expression double c=MUL(A,B);
다음과 같습니다 double c=((2+3)*(5-1));
*/
// 결과
// c=20

식에서 매개 변수를 사용할 때는 매개 변수를 괄호로 묶어야 합니다. 이렇게 하면 쉽게 찾을 수 없는 오류를 방지할 수 있습니다. 대괄호를 사용하지 않고 코드를 다시 쓰면 결과가 달라집니다:

 // 두 개의 매개 변수가 a 및 b인 예제
#define A 2+3
#define B 5-1
#define MUL(a, b) a*b
 
double c=MUL(A,B);
Print("c=",c);
/*
expression double c=MUL(A,B);
다음과 같습니다 double c=2+3*5-1;
*/
// 결과
// c=16

모수 형식을 사용할 경우 최대 8개의 모수가 허용됩니다.

 // 올바른 매개변수 형식
#define LOG(text)  Print(__FILE__,"(",__LINE__,") :",text)   // one parameter - 'text'
 
 // 잘못된 매개변수 형식        
#define WRONG_DEF(p1, p2, p3, p4, p5, p6, p7, p8, p9)   p1+p2+p3+p4 // p1에서 p9까지 8개 이상의 매개변수

 

#undef 명령문

#undef 명령문은 이전에 정의된 매크로 대체의 선언을 취소합니다.

예제:

#define MACRO
 
void func1()
  {
#ifdef MACRO
   Print("MACRO는 다음에 정의되어 있습니다: ",__FUNCTION__);   
#else
   Print("MACRO가 다음에 정의되어 있지 않습니다: ",__FUNCTION__);
#endif
  }
 
#undef MACRO
 
void func2()
  {
#ifdef MACRO
   Print("MACRO가 다음에 정의되어 있습니다: ",__FUNCTION__);
#else
   Print("MACRO가 다음에 정의되어 있지 않습니다: ",__FUNCTION__);
#endif
  }
 
void OnStart()
  {
   func1();
   func2();
  }
 
/* 결과:
MACRO가 func1에 정의되어 있습니다
MACRO가 func2에 정의되어 있지 않습니다
*/

더 보기

식별자, 문자 상수