Chapter 10. 전처리기(Preprocessor)
1. 전처리기의 실행
|
- 소스코드가 처리되는 단계
- 컴파일러가 진행되기 전에 소스코드를 전처리기가 먼저 처리한 후 컴파일러가 처리한다.
2. 전처리기
- 컴파일러가 소스 파일을 컴파일하기 전에 먼저 수행되는 프로그램(처리기)
- 프로그래머가 작성한 소스 파일이 컴파일될 수 있도록 준비하는 일을 한다.
- 모든 전처리기는 해시 표시(#)으로 시작된다.
- 일반적으로 대문자를 기초로 작성하고 세미콜론(;)을 붙이지 않는다.
전처리기 문장 |
기능 |
#include |
헤더 파일을 포함 |
#define |
매크로를 정의 |
#if, #else, #endif |
조건에 따라 컴파일한다. |
#ifdef |
매크로가 정의된 경우에 컴파일한다 |
#ifndef |
매크로가 정의되지 않은 경우에 컴파일한다. |
# |
문자열 만들기 연산자 |
## |
토큰결합 연산자 |
- 매크로
‧ 매크로는 매크로명을 명령 또는 수식, 상수로 치환해 준다.
‧ #define으로 정의한다.
‧ 매크로 상수
|
◦ 매크로명으로 정의하고 소스 파일에 매크로 명으로 된 단어를 사용하면 모두 매크로명과 같이 정의된 값(기호 상수)으로 대치되게 된다.
◦ 기호상수 : 매크로 상수처럼 이름을 갖는 상수
◦ 기호상수를 사용하면 프로그램을 쉽게 수정할 수 있고, 프로그램의 의미가 명확해지므로 알아보기 쉬워진다.
‧ 매크로 함수
|
◦ 함수처럼 인자를 갖는 매크로
◦ 매크로 함수라고 부르기는 하지만 실제로 함수가 아니라 매크로 상수처럼 문자열 대치를 통해서 코드를 확장 시키는 기능이기 때문에 매크로 함수는 함수가 아니다.
◦ 매크로 함수는 컴파일 시 인자의 데이터형 검사를 수행하지 않으며, 인자를 매개변수로 전달하는 함수 호출 과정이 수행되지 않아 실행속도가 빠르다.
◦ 데이터형에 독립적이기 때문에 어떤 데이터형이든 연산을 수행한다.
◦ 전처리기는 프로그램에서 매크로 함수가 사용된 곳을 만나면 ()안에 있는 문자열을 매크로 함수의 인자에 매핑(mapping)해서 문자열 대치를 수행한다.
◦ 함수 호출부가 매크로 함수 몸체 부분으로 완전히 치환되기 때문에 매크로 함수를 사용할수록 점점 커지기 때문에 함수의 크기가 작은 경우에만 사용한다.
◦ 매크로 함수를 사용할 때는 연산자 우선순위를 잘 생각해 사용하지 않으면 원하는 결과값이 나오지 않을 수 있다.
- 전처리기 연산자(#)
‧ #
|
◦ 문자열 만들기 연산자
◦ # 다음에 오는 이름 앞과 뒤에 큰따옴표(")를 붙여서 문자열 상수로 만들어 준다.
◦ # 연산자 다음에 오는 매크로 함수의 인자를 큰따옴표("")로 묶어서 문자열 상수로 만들어준다.
‧ 토큰 결합 연산자(##)
◦ 토큰 결합 연산자로 매크로 함수 안에서 토큰에 다른 토큰을 결합해서 새로운 토큰을 생성하는 역할을 한다.
◦ 토큰을 사용할때는 \(backslash)를 마지막 괄호 외에는 꼭 써줘야한다.
◦ 토큰
▹ C 프로그램의 최소 단위가 되는 식별자나 키워드 등을 말한다.
▹ 토큰은 함수가 될 때도 있다.
- 조건부 컴파일
‧ 조건부 컴파일 기능은 특정 조건이 만족할 때만 코드를 컴파일하도록 만드는 기능이다.
‧ #if, #else, #endif
|
◦ 조건부 컴파일 기능에서 if는 조건에 따라서 컴파일할 문장을 #if와 #endif로 묶어준다.
◦ 조건부 컴파일에서 #if는 if, #elif는 else if, else는 else에 해당한다.
‧ #ifdef, #ifndef
|
◦ #ifdef
▹ if defined의 약어
▹ #ifdef 다음에 오는 매크로가 정의되었으면 #ifdef ~ #endif 사이의 문장을 컴파일, 매크로가 정의되지 않았으면 컴파일하지 않는다.
▹ #define으로 정의하거나 컴파일 옵션으로 지정된다.
◦ ifnedf
▹ if not defined의 약자
▹ 특정 매크로 심볼이 정의되지 않은 경우에만 #ifndef ~ #endif 사이의 문장들을 컴파일하게 만든다.
- #include
‧ 특정 파일의 내용을 #include 문이 사용된 위치로 복사해 넣어주는 기능을 제공
‧ 다른 파일의 내용을 소스 파일에 복사해서 넣어주는 전처리 명령어 이며, 전처리기 중 가장 먼저 작성되어 가장 먼저 처리되는 전처리 명령어이다.
‧ C 프로그램의 소스 파일은 하나가 아니라 여러 개가 될 수도 있다.
‧ 소스 파일을 나누어서 작성할 때
◦ 보통은 관련된 함수나 변수들끼리 한 파일로 모아주는데, 이것은 관련된 코드를 한 곳에 모아두면 유지 보수하기가 쉬워지기 때문이다.
‧ 헤더파일
|
◦ 서로 다른 소스 파일 사이에서 필요한 정보를 공유할 수 있도록 하기 위해서 사용하며 구성이 아닌 선언만 가능하다.
◦ 라이브러리 헤더는 각괄호(<>)안에 쓰이며 사용자 정의 헤더는 큰따옴표("")안에 쓰인다.
◦ 라이브러리 헤더의 경우
▹ 헤더 파일 이름 각괄호(<>) 안에 들어 있으면, 헤더 파일을 C컴파일러의 포함 경로에서 찾으라는 의미
▹ 포함경로 ; 컴파일러가 제공하는 표준 라이브러리의 헤더 파일이 모여 있는 디렉터리
◦ 사용자 정의 헤더의 경우
▹ 헤더 파일 이름이 큰따옴표("") 안에 들어 있으면, 헤더 파일을 소스 파일이 있는 디렉터리에서 찾으라는 의미
'C Langauage' 카테고리의 다른 글
Chapter 12. 포인터 고급 (0) | 2015.08.05 |
---|---|
Chapter 11. 구조체(Struct) (0) | 2015.08.05 |
Chapter 9. 문자열(String) (0) | 2015.08.05 |
Chapter 8. 포인터(Pointer) (0) | 2015.08.05 |
Chapter 7. 함수(Function) (0) | 2015.08.05 |