The Pawn language - CompuPhase

디파인(define)

개요

디파인(define)은 무언가를 치환하는 개념입니다. 매크로 라고도 합니다. 전처리(Preprocessor)에 해당하며, 전처리는 코드 상에서 존재하던 내용이 컴파일러가 컴파일 할 때 처리되어 사라지는 것을 의미합니다.

아마도 이해가 잘 안될 것인데, 예제를 보고 이해하시는 것이 쉬울 것입니다.

예제 1

#include <a_samp>
#define EXAMPLE 100
main()
{
    printf("%d",EXAMPLE);
}

매크로를 사용하는 방법은 #define 매크로명 텍스트 입니다.

위 예제에서는 EXAMPLE 이라는 이름으로 매크로를 선언하였고, 그 값은 100 입니다. printf에서 EXAMPLE을 출력하게 되며, 100이 콘솔에 출력될 것입니다.

얼핏 보면 변수처럼 사용하는 것 같지만, 큰 차이가 있습니다. 전처리(Preprocessor)라는 점입니다. 만약 위 코드를 컴파일 하면 아래와 같이 코드가 바뀌게 됩니다.

#include <a_samp>
main()
{
    printf("%d",100);
}

차이가 무엇일까요? 위의 코드에서는 EXAMPLE이 분명 존재했었으나, 컴파일 직전에 아래 코드처럼 EXAMPLE이 100으로 변해 사라지고 컴파일이 됩니다. 즉, EXAMPLE은 소스 코드에서만 존재하며, 실제로 컴파일 될 때에는 EXAMPLE은 사라지고 100이 사용되어 컴파일 됩니다. 매크로는 사람이 보기 편하기 위해 사용하는 '별명' 입니다.

아직도 잘 이해가 되지 않는다면 예제를 더 보시기 바랍니다.

예제 2

매크로는 변수처럼 무언가를 담는 개념이 아닙니다. 소스 코드를 보기 쉽게 만들어주는 역할을 하는 것입니다. 컴파일 직전에 찾아 바꾸기 된다고 생각하시면 이해가 아주 쉽습니다.

#include <a_samp>

#define MY 100
#define EXAMPLE 3.14159
#define CODE "hello, world"

main()
{
    printf("%d",MY);
    printf("%f",EXAMPLE);
    printf("%s",CODE);
}

위 예제는 다양한 데이터를 치환하는 방법에 대해 보여줍니다. 실제로 컴파일러에 위 코드를 집어넣으면 컴파일 직전에 아래와 같이 코드가 변경됩니다. 코드 상에서 매크로가 전부 사라지는 것입니다.

#include <a_samp>
main()
{
    printf("%d",100);
    printf("%f",3.14159);
    printf("%s","hello, world");
}

예제 3

그렇다면 데이터만 치환이 될까요? 방금 언급했듯이 매크로는 변수가 아니기 때문에 데이터를 담는 개념이 아닙니다. 소스 코드의 글자를 찾아바꾸기 하는 개념입니다. 따라서 다양한 방법으로 사용이 가능합니다. 

#include <a_samp>
#define AMAZING printf
main()
{
    AMAZING("%d",100);
    AMAZING("%f",3.14159);
}

위 예제에서는 아예 printf라는 글자를 AMAZING으로 치환해 버렸습니다. 이처럼 소스 코드 안의 어떤 글자던지 매크로를 사용하여 치환이 가능합니다. 매크로를 사용할 때는 데이터라는 개념을 완전히 버려야 합니다. 그저 소스 코드의 '글자'만을 보시면 됩니다.

예제 4

좀 더 극단적으로 가보겠습니다. 이번에는 printf 함수 자체를 치환합니다.

#include <a_samp>
#define WOW printf("hello, world");
#define AWESOME printf("%d",1500);
main()
{
    WOW
    AWESOME
}

위 코드를 컴파일하면 코드가 아래와 같이 바뀐 후, 컴파일에 들어갑니다.

#include <a_samp>
main()
{
    printf("hello, world");
    printf("%d",1500);
}

예제 5 (argument 사용)

매크로란 단순히 글자를 찾아 바꾸기 하는 개념이라는 것을 이제는 이해하셨으리라 생각됩니다. 이번에는 조금 고급 사용법에 대해 배워보겠습니다.

매크로를 사용할 때 매개 변수(argument)를 사용하여 치환할 수도 있습니다. 아래 예제를 보시겠습니다.

#include <a_samp>
#define GOOD(%1) printf("%d",%1);
main()
{
    GOOD(12345)
}

잘 보시면 GOOD 매크로에 (%1)을 사용한 것을 알 수 있습니다. 오른쪽의 printf에도 동일하게 %1이 있음을 볼 수 있습니다. 매크로를 사용할 때 (%1) 자리에 들어가는 내용이 print에도 들어가게 됩니다. 매개 변수는 이처럼 '%번호'로 사용할 수 있습니다.

위 예제에서는 (%1) 자리에 12345를 넣었습니다. 따라서 컴파일 시에 printf("%d",12345); 처럼, %1 자리에 12345라는 텍스트가 들어가면서 매크로가 사라지게 됩니다.

다만, 여기서 12345를 썼다고 해서 %1에 숫자만 들어갈 수 있는 것은 아닙니다. 반복해서 언급하지만 매크로는 단순히 텍스트를 바꾸는 기능이라는 점을 인지하셔야 합니다. 12345 뿐만 아니라 다양한 텍스트를 %1 자리에 입력할 수 있으며, 코드가 컴파일 될 때 그 내용 그대로 치환됩니다.

예제 6 (argument 사용)

한 개가 아니라 여러 개의 매개 변수를 사용할 수도 있습니다.

#include <a_samp>
#define SUM(%1,%2,%3) %1+%2+%3
main()
{
    printf("%d", SUM(100,40,16) );
}

위 예제에서는 3개의 매개 변수를 사용하였습니다. 위 코드를 컴파일하면 컴파일러가 아래와 같이 코드를 수정하게 됩니다.

#include <a_samp>
main()
{
    printf("%d", 100+40+16 );
}

댓글

댓글 본문
  1. 준영
    1번 읽음.