#include <iostream>

using namespace std;

#define MY_NUMBER "Hello, World!"
#define MAX(a, b) ((a>b) ? a : b)

int main()
{
    cout << MY_NUMBER << endl;
    cout << MAX(1, 2);

    return 0;
}

여기서 MAX(a, b) 꼴은 함수처럼 보이지만 (a, b)가 함수의 파라미터처럼 취급되는건 아니다. 그저 치환당할 대상의 자리를 표시하는 정도이고, 문자열 치환으로 취급한다. 그래서 실제 함수 호출처럼 스택에 값 복사, 타입 검사 등이 발생하지 않고 그냥 코드를 복사해서 붙여 넣는 것이다. 예전에는 속도가 빠를 수 있다는 이유로 매크로 함수를 사용하는 경우가 많았지만, 요즘은 사용하지 않는 추세라고 한다.

 

 

이러한 `#define`, `#ifdef`와 같은 것들을 전처리기 지시문이라고 한다. 그리 매크로는 그 중에서 `#define`을 통해 만든 규칙을 의미한다. 이러한 전처리기 지시문은 말 그대로 '전'처리기라서 빌드전에 동작해서 빌드할 때 결정되고 시작한다. 그래서 운영체제 판별이나 그래픽카드 사양같은 것을 다룰 때 사용을 많이 하게 된다.

#include <iostream>

using namespace std;

#define MY_NUMBER "Hello, World!"
#define MAX(a, b) (((a)>(b)) ? (a) : (b)) // 치환될 때 이상하게 꼬일 수 있으니 그냥 치환 대상자체를 ()로 묶어 분리

# define LIKE_APPLE

int main()
{
    cout << MY_NUMBER << endl;
    cout << MAX(1 + 3, 2) << endl;

#ifdef LIKE_APPLE
    cout << "Apple " << endl;
#endif

#ifndef LIKE_APPLE
    cout << < "Orange " << endl;
#endif

    return 0;
}

 

 

그리고 define의 효과는 선언한 파일 안에서만 유효한점을 주의해야 한다.