C 전처리기와 매크로: #include, #define, 조건부 컴파일 마스터하기
C 전처리기와 매크로
C 전처리기의 힘을 탐구하세요: 헤더 포함, 상수/함수 정의, 조건부 지시문으로 컴파일 흐름 제어.
C 전처리기는 컴파일러보다 먼저 실행되어 매크로 확장, 헤더 파일 포함, 조건문 평가를 통해 소스 코드를 변환합니다. 유연하고 재사용 가능한 코드 작성에 필수적인 도구입니다.
모든 전처리기 지시문은 # 기호로 시작합니다. 예:
#define PI 3.14
#include 지시문은 헤더 파일의 내용을 소스 파일에 직접 삽입합니다. 일반적인 사용:
#include <stdio.h>
#include <stdio.h> 없이는 printf(), scanf() 같은 함수가 정의되지 않습니다. 사용자 정의 헤더도 만들 수 있습니다:
#include "my_header.h"
사용자 정의 헤더는 관련 함수 선언과 상수를 그룹화하는 데 유용합니다.
상수와 표현식 정의: #define
매크로는 토큰이나 표현식을 컴파일 전에 값으로 치환합니다. 예:
#define c 299792458 /* 빛의 속도 */
프로그램 어디에서든 c를 사용하면 299792458로 확장됩니다.
예제 1: PI 정의
#include <stdio.h>
#define PI 3.1415
int main() {
float radius, area;
printf("반지름 입력: ");
scanf("%f", &radius);
area = PI * radius * radius;
printf("Area=%.2f", area);
return 0;
}
함수형 매크로
매크로는 인자를 받아 인라인 함수처럼 동작할 수 있습니다:
#define circleArea(r) (3.1415 * (r) * (r))
circleArea(5)는 전처리기에 의해 (3.1415 * 5 * 5)로 확장됩니다.
예제 2: 함수형 매크로 사용
#include <stdio.h>
#define PI 3.1415
#define circleArea(r) (PI * (r) * (r))
int main() {
float radius, area;
printf("반지름 입력: ");
scanf("%f", &radius);
area = circleArea(radius);
printf("Area = %.2f", area);
return 0;
}
조건부 컴파일
조건부 지시문은 if 문처럼 컴파일 타임에 코드 블록을 포함하거나 제외합니다.
주요 용도
- 다른 운영체제나 하드웨어 대상 지정.
- 런타임 오버헤드 없는 디버그 빌드 생성.
- 레거시 코드 경로 유지.
핵심 지시문
#ifdef MACRO /* MACRO 정의 시 코드 */ #endif
#if EXPRESSION /* EXPRESSION이 0이 아닐 때 코드 */ #else /* EXPRESSION이 0일 때 코드 */ #endif
#if EXPRESSION /* 코드 */ #elif ANOTHER_EXPRESSION /* 대체 코드 */ #else /* 폴백 코드 */ #endif
#if defined BUFFER_SIZE && BUFFER_SIZE >= 2048 /* 버퍼가 충분히 큼 */ #endif
미리 정의된 매크로
| 매크로 | 값 |
__DATE__ | 현재 컴파일 날짜 문자열 |
__FILE__ | 현재 파일 이름 문자열 |
__LINE__ | 매크로가 나타나는 줄 번호 |
__STDC__ | ANSI C 표준 준수 시 0이 아님 |
__TIME__ | 현재 컴파일 시간 문자열 |
예제 3: 컴파일 시간 표시
#include <stdio.h>
int main() {
printf("Current time: %s", __TIME__);
return 0;
}
출력 예:
Current time: 19:54:39
추천 읽기
- Line Control
- Pragmas
- Preprocessor Output
- Other Directives