전처리기(Preprocessor)
프로그래머가 작성한. c 파일을 전처리기는 아래와 같은 전처리 작업을 수행한다
1. 주석 삭제
2. 매크로 처리 (매크로된 것을 모두 복사 붙여 넣기)
3. include 되어 있는 .h 헤더파일 처리 (헤더파일 모두 복사 붙여 넣기)
위와 같은 작업을 통해 만들어진 파일이 Translation unit 파일이다
전처리기 지시자 (#)
전처리기 지시자가 붙은 문을 전처리기 지시문이라고 부른다
ex) #include, #define, #ifndef, #endif, …
전처리기 지시문의 활용
1. 매크로 문법을 통해 텍스트 대체
#define 구문이 대표적이다
소스코드 상의 특정 텍스트를 대체한다
이외에도 #undef 구문 혹은 전처리기 연산자 #, ##을 활용.
2. 다른 소스파일을 인클루드
#include 구문으로 가능하다
3. 소스 파일의 일부를 조건부로 컴파일
#if, #ifdef, #ifndef, #else, #elif, #endif 구문으로 가능하다
4. 에러 강제 발생
#error 구문으로 가능하다
전처리기 지시문 종류
- #define {식별자} {값}
전처리기가 {식별자}를 보면 모두 {값}으로 대체한다
ex) #define TEN (10)
- #define {식별자}
{값}을 적지 않으면 전처리기 지시어 정의 구문이다
조건부 컴파일에서 {식별자} 정의 유무에 따라 분기한다
ex. #if, #ifdef, #ifndef, #else, #elif, #endif,...
- #undef {식별자}
기존에 정의되어 있던 {식별자}를 삭제한다
정의되어 있는 {식별자}가 없다면 무시한다
C 표준에 정의되어 있는 #define 구문들
__FILE__: 현재 파일명을 문자열로 표시 (오류 출력 시 주로 사용)
__LINE__: 현재 소스코드의 줄 번호를 정수형으로 표시 (오류 출력시 주로 사용)
__STDC_VERSION__: 현재 컴파일에 사용 중인 C 표준(C95 표준부터 지원)
이뿐만 아니라 각 컴파일러마다 추가로 정의된 기타 매크로들도 존재한다
fprintf(stderr, “Internal error: %s, line %d.\n”, __FILE__, __LINE__);
컴파일 플래그를 통한 매크로 정의
컴파일 플래그를 통해 매크로 정의가 가능하다
"-D" 컴파일 플래그로 매크로 정의가 가능하며 Define의 약자이다
clang -std=c99 -W -Wall -pedantic-errors -DA *.c
위와 같이 컴파일 플래그를 작성하면,
#define A (1)과 동일한 효과를 가진다
주의할 점은 #define A가 아니라는 점이다
혹은 아래와 같이 대체할 값을 지정할 수도 있다
clang -std=c99 -W -Wall -pedantic-errors -DA=7 *.c
#define A (7)과 동일한 효과를 가진다
컴파일 플래그를 통한 배포용 컴파일
"-DNDEBUG" 컴파일 플래그를 작성하면 배포(Release) 모드로 실행파일을 컴파일할 수 있다
Not Debug의 약자이고 assert() 함수 호출 코드가 사라진다
clang -std=c99 -W -Wall -pedantic-errors -DNDEBUG *.c
배포용으로 컴파일을 한다면,
디버그 모드에서만 실행되어야 하는 코드들은
#if !defined (NDEBUG)로 따로 처리해줘야 한다
'C > [코드조선] C 핵심' 카테고리의 다른 글
[C] 분할 컴파일과 라이브러리 (0) | 2024.02.18 |
---|---|
[C] 조건부 컴파일과 매크로 함수 (0) | 2024.02.18 |
[C] 입출력 리디렉션, 커맨드 라인 인자 (0) | 2024.02.17 |
[C] 파일 입출력 (2) (0) | 2024.02.16 |
[C] 파일 입출력 (1) (0) | 2024.02.16 |