본문 바로가기
공부/C++, C

메크로란? 정의하기, 해제하기 - #define, #undef

by 아찌방 2024. 10. 21.

 

메크로란??

매크로(Macro)는 C++에서 전처리기 지시문을 통해 정의되는 텍스트 치환 규칙입니다. 즉, 매크로는 특정 코드를 간단한 이름으로 정의하고, 프로그램에서 해당 이름을 사용할 때마다 미리 정의한 코드로 치환되는 기능을 제공합니다. 매크로는 주로 반복적인 코드를 간편하게 작성하거나, 상수 값을 관리하기 위해 사용됩니다.

 

매크로는 전처리 단계에서 처리되며, 실제 컴파일 전에 소스 코드에서 매크로가 정의된 위치에 지정된 코드나 값으로 대체됩니다.

 

매크로의 기본 형태

매크로는 #define 지시문을 사용하여 정의됩니다.

  1. 기본 매크로 (상수처럼 사용):
    #define NAME replacement


  2. 함수처럼 매개변수를 받는 매크로:
    #define NAME(arg1, arg2) (replacement using arg1 and arg2)

 

1. 기본 매크로 (상수 매크로)

주로 상수 값을 정의할 때 사용 함. (const나 constexpr가 더 자주 사용 됨.)

예시:

#include <iostream> 
#define PI 3.14159

int main() { 
	std::cout << "Value of PI: " << PI << std::endl;
    return 0;
}
 
  • #define PI 3.14159: 여기서 PI는 3.14159로 치환됨
  • std::cout << PI;는 실제로 std::cout << 3.14159;로 변환된 후 컴파일됨

 

 

2. 함수형 매크로

매크로는 함수처럼 매개변수를 받아서 동작할 수도 있습니다. 다만, 실제 함수처럼 동작하는 것이 아니라 텍스트 치환이 이루어집니다.

예시:

#include <iostream>

#define SQUARE(x) ((x) * (x))

int main() {
    std::cout << "Square of 5: " << SQUARE(5) << std::endl;
    return 0;
}
  • SQUARE(x): x 값을 받아서 (x) * (x)로 치환됨.
  • SQUARE(5)는 실제로 ((5) * (5))로 치환되어 25를 출력합니다.

 

매크로의 장점:

  1. 코드의 간결화: 자주 반복되는 코드를 한 번 정의하고, 간단한 이름으로 재사용할 수 있습니다.
  2. 실행 속도 향상: 매크로는 함수처럼 보일 수 있지만, 함수 호출 오버헤드가 없고 단순히 텍스트 치환이므로 컴파일된 코드는 함수 호출보다 빠를 수 있습니다.

 

매크로의 단점:

  1. 디버깅이 어려움: 매크로는 단순히 치환되기 때문에 실제 코드에서 오류가 발생할 경우, 매크로가 아닌 치환된 코드에서 문제를 찾아야 하므로 디버깅이 어려울 수 있습니다.
  2. 부작용 가능성: 함수형 매크로는 매개변수가 여러 번 평가될 수 있어 부작용(side effect)을 일으킬 수 있습니다.
#define DOUBLE(x) ((x) + (x))
int i = 5;
std::cout << DOUBLE(i++); // 예상과 달리 i가 두 번 증가될 수 있음

 

         이러한 이유로 인라인 함수 const 상수를 사용하는 것이 권장됩니다.

 

 

#undef

C++에서 전처리기 지시문으로, 매크로의 정의를 해제(undeclare)하는 데 사용됩니다. 즉, #undef를 사용하면 이전에 #define으로 정의된 매크로를 더 이상 사용할 수 없게 만듭니다.

기본 형식:

#undef MACRO_NAME
#undef는 주로 코드에서 매크로의 재정의를 방지하거나, 매크로가 특정 구간에서만 유효하게 하고 그 이후에는 무효화하는 용도로 사용됩니다.

예시:

#include <iostream>
#define PI 3.14159
int main() { 
	std::cout << "Value of PI: " << PI << std::endl; 
    
    // PI 매크로 정의 해제 
    #undef PI 
    
    // 아래 코드는 컴파일 오류가 발생. PI가 더 이상 정의되지 않았기 때문입니다. 
    // std::cout << "Value of PI after undef: " << PI << std::endl; 
    return 0; 
}
 

왜 사용하나요?

  • 매크로 중복 방지: 코드의 다른 부분에서 같은 이름의 매크로를 정의하려면, 기존 정의를 해제하고 새로운 정의를 할 수 있도록 사용합니다.
  • 코드 유지보수: 필요 없는 매크로 정의를 해제하여 코드 가독성을 높이거나 관리하기 쉽게 만들 수 있습니다.
728x90