그라운드 임베디드 유튜브 구독

노트 / C 언어

전처리기와 매크로

#define, 조건부 컴파일, 헤더 가드. 매크로가 만드는 함정과 안전하게 쓰는 방법.

GROUND EMBEDDED · 정리 노트C 언어 11전처리기와 매크로 1#define SQ(x) x * x 2SQ(a + 1)// a + 1 * a + 1 로 펼쳐짐 3#define SQ(x) ((x) * (x))// 괄호로 감싸기

전처리기는 컴파일 전에 글자를 바꾸는 단계입니다. #include는 파일 내용을 그대로 붙이고, #define은 이름을 값으로 치환합니다.

매크로의 함정

#define SQ(x) x * x
SQ(a + 1)      // a + 1 * a + 1 로 펼쳐짐
#define SQ(x) ((x) * (x))   // 괄호로 감싸기

인자를 두 번 쓰는 매크로에 i++를 넣으면 두 번 증가합니다. 계산이 들어가는 매크로는 static inline 함수로 바꾸는 것이 안전합니다.

조건부 컴파일

#ifdef DEBUG
  log_printf("adc=%u\n", adc);
#endif

보드 버전이나 디버그 빌드에 따라 코드를 넣고 뺍니다. 남용하면 어떤 조합이 실제로 빌드되는지 알 수 없게 되니 설정 헤더 한 곳에 모읍니다.

헤더 가드

같은 헤더가 두 번 포함되어 정의가 겹치는 것을 막습니다.

#ifndef MOTOR_H
#define MOTOR_H
...
#endif