다른 글
[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"); }