<전처리기>
: 컴파일러가 소스 파일을 컴파일하기 전에 먼저 수행되는 프로그램
- 프로그래머가 작성한 소스 파일이 컴파일될 수 있도록 준비함
- 전처리기 문장은 '#'으로 시작
· #define: 매크로를 정의
· #include: 헤더 파일을 포함
· #if, #else, #endif: 조건에 따라 컴파일
· #ifdef: 매크로가 정의된 경우에 컴파일
· #ifndef: 매크로가 정의되지 않는 경우에 컴파일
<매크로 상수>
- 형식: #define 매크로명 값
전처리기 #define: 소스파일에서 매크로 상수가 사용된 곳을 모두 찾아서 정의된 문자열로 대치
- 매크로명은 관습적으로 대문자
<매크로 함수>
: 함수처럼 인자를 갖는 매크로
- 매크로 상수처럼 매크로 함수가 사용되는 곳에 문자열 대체를 통해서 코드를 확장함
- 형식: #define 매크로 함수명(인자1, 인자2, ...)대치할 내용
- 매크로 함수는 함수인 것처럼 보이지만 사실은 함수가 아님(그냥 문자열)
- 컴파일 시에 인자의 데이터형 검사를 수행하지 않으며, 함수가 아니기 때문에 인자를 매개변수로 전달하는 함수 호출 과정이 수행되지 않음
- 매크로 함수 사용 시 문자열 대치 과정에서 잘못된 결과가 만들어질 수도 있음(* 순서 등)
- 매크로 함수의 장점: 매크로 함수를 사용하면 프로그램의 실행 속도가 빨라짐(매크로 함수를 사용할 때는 함수 호출이 일어나지 않으므로 함수 호출의 오버헤드를 줄일 수 있음)
- 매크로 함수의 단점:
· 매크로 함수를 많이 사용하는 프로그램은 프로그램의 크기가 커짐
cf) 일반 함수 코드는 한 번만 컴파일해서 만들어 두고, 함수 코드를 필요할 때마다 반복해서 호출하는데
매크로 함수는 사용되는 곳마다 매크로 함수를 확장한 코드가 복사되기 때문
· 매크로 함수를 사용하면, 코드가 알아보기 어려워짐
- 예약 매크로
__(언더바 2개)DATE__: 최근에 컴파일한 날짜
__FILE__: 소스파일의 이름을 절대경로와 함께함
__LINE__: 소스파일에서 해당 문장이 있는 줄 번호
__TIME__: 최근에 컴파일한 시각
__TIMESTAMP__: 소스파일을 수정한 시각
<조건부 컴파일>: #if, #else, #endif
- 특정 조건이 만족할 때만 코드를 컴파일함
- 상황에 따라서 특정 코드를 컴파일하게 또는 컴파일하지 않게 만들 수 있음
- 이식성 있는 코드를 개발할 때 유용함
- 형식
#if 조건식
문장;
#endif
- #if 조건식에는 매크로를 정수와 비교하는 관계 연산자가 주로 사용되고, 산술 연산자, 논리 연산자 등이 사용될 수 있음
cf) 전처리문에서 같냐는 = 이거 한개임 주의
- #if의 조건식에서 매크로를 실수나 문자열과 비교할 수 없음
- #if에는 반드시 짝이 되는 #endif가 필요하며, #else를 함께 사용할 수도 있음
#if 조건식
문장;
#elif 조건식
문장;
#else
문장;
#endif
- #if, #endif에서는 컴파일할 문장이 여러 개여도 { }로 묶어줄 필요가 없음
- #if 안에 다른 #if를 중첩해서 사용할 수 있으며, 각각의 #if마다 #endif가 하나씩 짝을 이루어야 함
<#ifdef>
: if defined
- #ifdef는 특정 매크로의 정의 여부에 따라 #ifdef와 #endif 사이의 문장을 컴파일할지 결정
- 형식
#ifdef 매크로명
문장;
#endif
- DEBUG 매크로 정의 시에만 함수 정보를 출력하는 경우
- 출력문에 수행되려면 DEBUG 매크로 정의가 필요함
<#ifndef>
: if not defined
- #ifnded 다음의 매크로가 정의되지 않은 경우에만 #ifndef와 #endif 사이의 문장이 컴파일
'C언어' 카테고리의 다른 글
C언어 - 포인터 배열 (0) | 2021.07.10 |
---|---|
C언어 - 스토리지 클래스 (0) | 2021.07.10 |
C언어- 함수의 인자 (0) | 2021.07.09 |
C언어 - 공용체와 열거체 (0) | 2021.07.09 |
C언어 - 구조체 (0) | 2021.07.09 |