학습내용
- 매크로
- 조건부 컴파일
학습목표
- 매크로 상수와 매크로 함수의 쓰임새를 알고 프로그램에 구현할 수 있다.
- 조건부 컴파일 구분을 이해하고 사용할 수 있다.
매크로
1. 전처리기
- 컴파일러가 소스 파일을 컴파일하기 전에 먼저 수행되는 프로그램
1) 프로그래머가 작성한 소스 파일이 컴파일될 수 있도록 준비함
2) 전처리기 문장은 '#'으로 시작
전처리기 문장 | 기능 |
#define | 매크로를 정의 |
#include | 헤더 파일을 포함 |
#if, #else, #endif | 조건에 따라 컴파일 |
#ifdef | 매크로가 정의된 경우에 컴파일 |
#ifndef | 매크로가 정의되지 않는 경우에 컴파일 |
2. 매크로 상수
3. 매크로 함수
1) 매크로 함수는 함수처럼 인자를 갖는 매크로
2) 매크로 상수처럼 함수가 사용되는 곳에 문자열 대치를 통해서 코드를 확장함
3) 매크로 함수는 함수인 것처럼 보이지만 사실은 함수가 아님
4) 컴파일 시에 인자의 데이터형 검사를 수행하지 않으며, 인자를 매개변수로 전달하는 함수 호출 과정이 수행되지 않음
5) 매크로 함수 사용 시 문자열 대치 과정에서 잘못된 결과가 만들어질 수도 있음
- 매크로 함수의 장.단점
매크로 함수의 장점 | 매크로 함수의 단점 |
- 매크로 함수를 사용하면 프로그램의 실행 속도가 빨라짐 --> 매크로 함수를 사용할 때는 함수 호출이 일어나지 않으 므로 함수 호출의 오버헤드를 줄일 수 있음 |
- 매크로 함수를 많이 사용하는 프로그램은 프로그램의 크기가 커짐 --> 일반 함수코드는 한 번만 컴파일해서 만들어 두고, 함수 코드를 필요할 때마다 반복해서 호출함 --> 매크로 함수는 사용되는 곳마다 매크로 함수를 확장한 코드가 복사됨 |
4. 예약 매크로
매크로 | 설명 |
__DATE__ | 최근에 컴파일한 날짜 |
__FILE__ | 소스파일의 이름을 절대경로와 함께함 |
__LINE__ | 소스파일에서 해당 문장이 있는 줄 번호 |
__TIME__ | 최근에 컴파일한 시작 |
__TIMESTAMP__ | 소스파일을 수정한 시작 |
조건부 컴파일
1. #if, #else, #endif
1) 특정 조건이 만족할 때만 코드를 컴파일함
2) 상황에 따라서 특정 코드를 컴파일하게 또는 컴파일하지 않게 만들 수 있음
3) 이식성 있는 코드를 개발할 때 유용함
4) #if의 조건식에는 매크로를 정수와 비교하는 관계 연산자가 주로 사용되고, 산술 연산자, 논리 연산자 등 이 사용될 수 있음
5) if의 조건식에서 매크로를 실수나 문자열과 비교할 수 없음
6) #if에는 반드시 짝이 되는 endif 가 필요하며 , #else 를 함께 사용할 수도 있음
7) #if, #endif 에서는 컴파일할 문장이 여러 개여도 { 로 묶어줄 필요가 없음
8) #if 안에 다른 #if 를 중첩해서 사용할 수 있으며 , 각각의 #if 마다 endif 가 하나씩 짝을 이루어야 함
2. #ifdef
1) "if defined"라는 의미
2) #ifdef는 특정 매크로의 정의 여부에 따라 #ifdef와 #endif 사이의 문장을 컴파일할지 결정
3) DEBUG 매크로 정의 시에만 함수 정보를 출력하는 경우
4) 출력문에 수행되려면 DEBUG 매크로 정의가 필요함
2. #ifdef
학습정리
1. 매크로
- 전처리기는 컴파일 전 수행되는 프로그램임
- 매크로 상수와 함수는 컴파일 시 대치되는 문장임
- 예약 매크로는 미리 정의된 매크로 상수임
2. 조건부 컴파일
- 조건부 컴파일은 특정 조건이 만족할 때만 코드를 컴파일함
- #ifdef, #ifndef는 매크로 상수의 정의 여부에 따라 컴파일함