소스코드를 작성하다보면 #define으로 처리하여 코드의 가독성을 높이기 위해 노력해야한다. 오늘은 #define으로 매크로 정리를 전체적으로 할려고 한다.
#define은 특정 값에 이름을 붙이거나 코드를 조합하여 함수 형태로 만들 수 있습니다. 매크로를 사용하면 전처리기를 거쳐 내부적으로 소스 코드가 일괄 변환됩니다
// 값을 매크로로 정의 // 10을 COUNT로 정의
#define 매크로이름 값 #define COUNT 10
// 함수 모양으로 매크로 정의 // 숫자를 출력하는 PRINT_NUM 매크로 정의
#define 매크로이름(x) 함수(x) #define PRINT_NUM(x) printf("%d\n", x)
// 여러 줄을 매크로로 정의 // printf 세 줄을 PRINT_NUM3으로 정의
#define 매크로이름 코드1 \ #define PRINT_NUM3(x) printf("%d\n", x); \
코드2 \ printf("%d\n", x + 1); \
코드3 printf("%d\n", x + 2);
// 값을 붙이는 매크로 정의 // a와 b를 붙이는 CONCAT 매크로 정의
#define 매크로이름(a, b) a##b #define CONCAT(a, b) a##b
// 정의한 매크로 해제 // COUNT 매크로 해제
#undef 매크로 #undef COUNT
위와 같은 #define은 값을 매크로로 정의하거나 함수모양으로 정의 할 때 많이 사용한다. (조건부 컴파일은 다음에 작성하도록 하겠습니다.)
또한 매크로를 사용할 떄는 연사자의 우선순위를 생각해야 합니다.
#define MUL(a, b) a * b
// 결과로 21을 예상함
printf("%d\n", MUL(1 + 2, 3 + 4)); // 11: 1 + 2 * 3 + 4
// 1 + 6 + 4
// 11
// 2 * 3이 먼저 계산
#define MUL(a, b) ((a) * (b))
printf("%d\n", MUL(1 + 2, 3 + 4)); // 21: ((1 + 2) * (3 + 4))
// ((3) * (7))
// (21)
위와 같이 #define 앞에 들어가는 인수들을 모두 괄호로 묶어주면 연산자 우선순위로 인하여 사용자가 원하지 계산이 되는것을 방지할 수 있습니다.