매크로 정리

유명현·2022년 1월 2일
0

소스코드를 작성하다보면 #define으로 처리하여 코드의 가독성을 높이기 위해 노력해야한다. 오늘은 #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 앞에 들어가는 인수들을 모두 괄호로 묶어주면 연산자 우선순위로 인하여 사용자가 원하지 계산이 되는것을 방지할 수 있습니다.

profile
기억보다 기록을

0개의 댓글