고흐의 연구실/C언어와 C++

[C언어] 매크로 #define #undef

전고흐 2020. 10. 11. 22:34
728x90

 #define 지시자는 값을 다른 이름으로 정의하며 이름을 짓는 방법은 변수와 같습니다. 보통 매크로는 대문자를 사용합니다.

  • #define 매크로이름 값

define 은 변수명을 지정하듯 사용해도 된다고 생각하면 될 듯합니다.

 

#define으로 정의한 매크로는 다른 이름으로 다시 정의할 수 있습니다.

#define ARRAY_SIZE 10 // 10을 ARRAY_SIZE로 정의
#define DEFAULT_ARRAY_SIZE ARRAY_SIZE // ARRAY_SIZE를 DEFAULT_ARRAY_SIZE로 정의

 

#define으로 정의한 매크로를 해제하고 싶을 때는 #undef를 사용합니다.

  • #undef 매크로이름

 

#define은 함수 모양의 매크로도 정의할 수 있습니다.

  • #define 매크로이름(x) 함수(x)
  • #define 매크로이름(x) 코드조합

example)

#include <stdio.h>

#define PRINT_NUM(x) printf("%d\n", x)    // printf("%d\n", x)를 PRINT_NUM(x)로 정의

int main()
{
    PRINT_NUM(10);    // 10: printf("%d\n", 10)

    PRINT_NUM(20);    // 20: printf("%d\n", 20)

    return 0;
}

#define은 줄바꿈이 일어날 때 \를 사용하여 여러 줄을 매크로로 만들 수 있습니다.

 

 

example) SWAP 매크로

#include <stdio.h>

// 매크로 안에서 변수를 선언할 수 있도록 do while 사용
// a와 b의 값을 서로 바꿈
#define SWAP(a, b, type) do { \
    type temp; \
    temp = a;  \
    a = b;     \
    b = temp;  \
} while (0)

int main()
{
    int num1 = 10;
    int num2 = 20;

    SWAP(num1, num2, int);            // 값을 바꿀 자료형으로 int를 지정
    printf("%d %d\n", num1, num2);    // 20 10: 두 변수의 값이 바뀜

    float num3 = 1.5f;
    float num4 = 3.8f;

    SWAP(num3, num4, float);          // 값을 바꿀 자료형으로 float를 지정
    printf("%f %f\n", num3, num4);    // 3.800000 1.500000: 두 변수의 값이 바뀜

    return 0;
}

do while (0) { } (중괄호)로 묶여 있기 때문에 안에서 변수를 마음대로 선언할 수 있고, 선언된 변수는 do while (0)을 벗어나면 변수가 사라집니다. 즉, SWAP 매크로를 계속 사용했을 때 같은 이름으로 된 변수가 여러 개 생기지만 컴파일 에러를 방지할 수 있습니다.

 

#define 연산자 우선순위

// a와 b, 결과를 모두 괄호로 묶어줌
#define MUL(a, b) ((a) * (b))

// a와 b, 결과를 모두 괄호로 묶어줌
#define ADD(a, b) ((a) + (b))

 

#define 연결

#define에서 ##을 사용하면 여러 코드(값)를 붙일 수 있습니다.

  • #define 매크로이름(a, b) a##b

example1)

#include <stdio.h>

// a와 b를 붙이는 CONCAT 매크로 정의
#define CONCAT(a, b) a##b

int main()
{
    printf("%d\n", CONCAT(1, 2));    // 12

    return 0;
}

>> 결과 : 12

 

example2)

#include <stdio.h>

// hello와 x를 붙여서 호출하는 EXECUTER 매크로 정의
#define EXECUTER(x) hello##x()

void hello1()
{
    printf("hello 1\n");
}

void hello2()
{
    printf("hello 2\n");
}

int main()
{
    EXECUTER(1);    // hello1 함수 호출

    EXECUTER(2);    // hello2 함수 호출

    return 0;
}

>> 결과 : hello 1

              hello 2

 

 

출처 : dojang.io/course/view.php?id=2

728x90