75.3 여러 줄을 묶어서 매크로로 정의하기

지금까지 숫자 한 개나 코드 한 줄을 매크로로 정의해서 사용했습니다. 그럼 여러 줄을 매크로로 만들 수 있지 않을까요?

#define은 줄바꿈이 일어날 때 \를 사용하여 여러 줄을 매크로로 만들 수 있습니다. 단, 맨 마지막 줄은 \를 사용하지 않아도 됩니다.

#define 매크로이름 코드1 \
                  코드2 \
                  코드3

다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

macro_function_multiline.c

#include <stdio.h>

// printf 세 줄을 PRINT_NUM3으로 정의
#define PRINT_NUM3(x) printf("%d\n", x); \
                      printf("%d\n", x + 1); \
                      printf("%d\n", x + 2);

int main()
{
    PRINT_NUM3(10);    // 10
                       // 11
                       // 12

    PRINT_NUM3(20);    // 20
                       // 21
                       // 22

    return 0;
}

실행 결과

10
11
12
20
21
22

printf 세 줄을 묶어서 PRINT_NUM3으로 정의했습니다. 여기서는 두 번째 printf에는 1을 더했고, 세 번째 printf에는 2를 더했습니다.

// printf 세 줄을 PRINT_NUM3으로 정의
#define PRINT_NUM3(x) printf("%d\n", x); \
                      printf("%d\n", x + 1); \
                      printf("%d\n", x + 2);

전처리기 과정을 거치면 PRINT_NUM3(x)는 다음과 같이 printf 세 줄로 바뀌게 됩니다.

그림 75‑4 #define으로 여러 줄을 매크로로 정의

여러 줄로 된 매크로를 사용할 때는 조건문, 반복문 사용에 주의해야 합니다.

macro_function_multiline_if.c

#include <stdio.h>

#define PRINT_NUM3(x) printf("%d\n", x); \
                      printf("%d\n", x + 1); \
                      printf("%d\n", x + 2);

int main()
{
    int num1 = 1;

    if (num1 == 2)
        PRINT_NUM3(10);    // 11
                           // 12

    return 0;
}

실행 결과

11
12

소스 코드를 실행했을 때 num1은 1이므로 다음 if 조건문은 실행되지 않아야 합니다. 하지만 11, 12가 출력되었습니다.

int num1 = 1;

if (num1 == 2)
    PRINT_NUM3(10);    // 11
                       // 12

이 코드가 전처리기 과정을 거치면 다음과 같이 if 아래 줄에 printf 세 줄이 생깁니다. 자세히 보면 첫 째줄 printfif의 영향을 받고 나머지 두 줄은 영향을 받지 않는다는 것을 알 수 있습니다.

int num1 = 1;

if (num1 == 2)
    printf("%d\n", 10); // ← 첫 째줄만 if의 영향을 받음
    printf("%d\n", 10 + 1); // ← 두 번째 세 번째 줄은 if의 조건과는 상관없이 무조건 실행됨
    printf("%d\n", 10 + 2); // ← 두 번째 세 번째 줄은 if의 조건과는 상관없이 무조건 실행됨

따라서 if 조건문에 여러 줄로 된 매크로를 사용할 때는 반드시 중괄호로 묶어주어야 합니다.

그림 75‑5 if 조건문에 여러 줄로 된 매크로를 사용할 때

if 조건문뿐만 아니라 for, while 반복문도 여러 줄로 된 매크로를 사용할 때는 반드시 중괄호로 묶어주어야 합니다.

for (int i = 0; i < 10; i++)
{ // 중괄호로 묶어줌
    PRINT_NUM3(10);    // 여러 줄로 된 매크로
}