전처리기와 매크로
#define, 조건부 컴파일, 헤더 가드. 매크로가 만드는 함정과 안전하게 쓰는 방법.
전처리기는 컴파일 전에 글자를 바꾸는 단계입니다. #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