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 세 줄로 바뀌게 됩니다.
여러 줄로 된 매크로를 사용할 때는 조건문, 반복문 사용에 주의해야 합니다.
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 세 줄이 생깁니다. 자세히 보면 첫 째줄 printf만 if의 영향을 받고 나머지 두 줄은 영향을 받지 않는다는 것을 알 수 있습니다.
int num1 = 1; if (num1 == 2) printf("%d\n", 10); // ← 첫 째줄만 if의 영향을 받음 printf("%d\n", 10 + 1); // ← 두 번째 세 번째 줄은 if의 조건과는 상관없이 무조건 실행됨 printf("%d\n", 10 + 2); // ← 두 번째 세 번째 줄은 if의 조건과는 상관없이 무조건 실행됨
따라서 if 조건문에 여러 줄로 된 매크로를 사용할 때는 반드시 중괄호로 묶어주어야 합니다.
if 조건문뿐만 아니라 for, while 반복문도 여러 줄로 된 매크로를 사용할 때는 반드시 중괄호로 묶어주어야 합니다.
for (int i = 0; i < 10; i++) { // 중괄호로 묶어줌 PRINT_NUM3(10); // 여러 줄로 된 매크로 }