[C, C++] 매크로(define) 여러줄로 정의

다른 글

[C, C++] 가변인자를 가지는 매크로(define) 구현

매크로 여러줄 정의 방법

매크로는 기본적으로 #define 뒤에 따라오는 한줄만 정의한다. 그러나 여러 줄을 하나의 매크로에 정의해야 할 일이 생길 수도 있다. 그럴때는 가장 뒤에 역슬래시()만 입력하면 된다.

구현

테스트환경 : Windows10 / Visual Studio Code / gcc 6.3.0

라인 가장 뒤에 역슬래시를 입력하고 그 다음줄에 계속 작성하면 된다. 가장 마지막줄은 역슬래시를 생략해도 무방하다.

#include <stdio.h>

#define print() \
    printf("first line\n"); \
    printf("second line\n"); \
    printf("third line\n");

int main()
{
    print();
}

if문과 함께 사용시 주의점

위 방법으로 정의한 매크로는 아래와 같이 if문에서 사용 시 컴파일 에러가 발생한다.

#include <stdio.h>

#define print() \
    printf("first line\n"); \
    printf("second line\n"); \
    printf("third line");

int main()
{
    if(1) print();
    else printf("else");
}

이유는 if문에 중괄호가 없기 때문에 단 한줄만 if문으로 인식하지만, print 매크로는 세줄을 가지고 있기 때문이다. 따라서 중괄호를 넣어주면 해결이 가능하다.

#include <stdio.h>

#define print() \
    printf("first line\n"); \
    printf("second line\n"); \
    printf("third line");

int main()
{
    if(1) {print();} // 중괄호 추가
    else printf("else");
}

그러나 if문이 한줄일 때 중괄호를 넣지 않는 습관을 가진 사람이 print 매크로가 세줄인 것을 모르거나 잊어버렸을 때 위와 같은 에러는 언제든 발생할 수 있다. 따라서 if문과 상관없이 매크로에서 위 오류를 해결할 수 있는 방법이 필요하다.

if문에서 발생하는 오류를 해결하는 방법

매크로로 묶을 여러라인을 do {…} while(0) 내부에 포함하면 if문에 중괄호를 넣지 않더라도 오류가 발생하지 않는다.

#include <stdio.h>

#define print() \
    do{ \
        printf("first line\n"); \
        printf("second line\n"); \
        printf("third line"); \
    } while(0)

int main()
{
    if(1) print();
    else printf("else");
}

Leave a Comment