본문 바로가기

C Langauage

Chapter 10. 전처리기(Preprocessor)

Chapter 10. 전처리기(Preprocessor)
1. 전처리기의 실행

 - 소스코드가 처리되는 단계

 - 컴파일러가 진행되기 전에 소스코드를 전처리기가 먼저 처리한 후 컴파일러가 처리한다.


2. 전처리기
 - 컴파일러가 소스 파일을 컴파일하기 전에 먼저 수행되는 프로그램(처리기)
 - 프로그래머가 작성한 소스 파일이 컴파일될 수 있도록 준비하는 일을 한다.
 - 모든 전처리기는 해시 표시(#)으로 시작된다.
 - 일반적으로 대문자를 기초로 작성하고 세미콜론(;)을 붙이지 않는다.

전처리기 문장

기능

#include

헤더 파일을 포함

#define

매크로를 정의

#if, #else, #endif

조건에 따라 컴파일한다.

#ifdef

매크로가 정의된 경우에 컴파일한다

#ifndef

매크로가 정의되지 않은 경우에 컴파일한다.

#

문자열 만들기 연산자

##

토큰결합 연산자

 - 매크로
  ‧ 매크로는 매크로명을 명령 또는 수식, 상수로 치환해 준다.
  ‧ #define으로 정의한다.
  ‧ 매크로 상수

  ◦ 매크로명으로 정의하고 소스 파일에 매크로 명으로 된 단어를 사용하면 모두 매크로명과 같이 정의된 값(기호 상수)으로 대치되게 된다.
  ◦ 기호상수 : 매크로 상수처럼 이름을 갖는 상수
  ◦ 기호상수를 사용하면 프로그램을 쉽게 수정할 수 있고, 프로그램의 의미가 명확해지므로 알아보기 쉬워진다.
  ‧ 매크로 함수

  ◦ 함수처럼 인자를 갖는 매크로
  ◦ 매크로 함수라고 부르기는 하지만 실제로 함수가 아니라 매크로 상수처럼 문자열 대치를 통해서 코드를 확장 시키는 기능이기 때문에 매크로 함수는 함수가 아니다.
  ◦ 매크로 함수는 컴파일 시 인자의 데이터형 검사를 수행하지 않으며, 인자를 매개변수로 전달하는 함수 호출 과정이 수행되지 않아 실행속도가 빠르다.

  ◦ 데이터형에 독립적이기 때문에 어떤 데이터형이든 연산을 수행한다.

  ◦ 전처리기는 프로그램에서 매크로 함수가 사용된 곳을 만나면 ()안에 있는 문자열을 매크로 함수의 인자에 매핑(mapping)해서 문자열 대치를 수행한다.
  ◦ 함수 호출부가 매크로 함수 몸체 부분으로 완전히 치환되기 때문에 매크로 함수를 사용할수록 점점 커지기 때문에 함수의 크기가 작은 경우에만 사용한다.
  ◦ 매크로 함수를 사용할 때는 연산자 우선순위를 잘 생각해 사용하지 않으면 원하는 결과값이 나오지 않을 수 있다.
 - 전처리기 연산자(#)
 ‧ #

 

  ◦ 문자열 만들기 연산자
  ◦ # 다음에 오는 이름 앞과 뒤에 큰따옴표(")를 붙여서 문자열 상수로 만들어 준다.
  ◦ # 연산자 다음에 오는 매크로 함수의 인자를 큰따옴표("")로 묶어서 문자열 상수로 만들어준다.
 ‧ 토큰 결합 연산자(##)

  ◦ 토큰 결합 연산자로 매크로 함수 안에서 토큰에 다른 토큰을 결합해서 새로운 토큰을 생성하는 역할을 한다.
  ◦ 토큰을 사용할때는 \(backslash)를 마지막 괄호 외에는 꼭 써줘야한다.

  ◦ 토큰
   ▹ C 프로그램의 최소 단위가 되는 식별자나 키워드 등을 말한다.
   ▹ 토큰은 함수가 될 때도 있다.
 - 조건부 컴파일
 ‧ 조건부 컴파일 기능은 특정 조건이 만족할 때만 코드를 컴파일하도록 만드는 기능이다.
 ‧ #if, #else, #endif

 

 

 

 

 

  ◦ 조건부 컴파일 기능에서 if는 조건에 따라서 컴파일할 문장을 #if #endif로 묶어준다.
  ◦ 조건부 컴파일에서 #if if, #elifelse if, elseelse에 해당한다.
 ‧ #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