2016. 2. 22. 21:06

전처리기

 

- #include <stdio.h> 입출력 전처리기 호출

- #define 치환(정의) 역할

- #ifndef 매크로상수 재정의 방지, 조건부 실행

- #if () 조건부, 조건식에 따라 전처리를 수행

 

전처리기는 전에 처리하는 기능이 있다고 해서, 전처리기 이다. C언어 초반에 #include<stdio.h>를 코딩하고,

본격적으로 프로그래밍을 시도하는데, 그것의 의미를 알아두면, 전처리기를 보다 쉽게 이해할 수 있다.

 

 

> # include <stdio.h>

 

요약하면, "전처리기(#)야 include라는 파일에 있는 stdio.h 헤더파일을 미리 실행해죠" 이다.

stdio.h 는 include라는 파일에 있는 헤더파일 -C언어 함수들이 압축되어 있는 파일이다- 이다.

전처리기는 이 파일을 컴파일러가 기능을 수행하기 전에 미리 처리한다.

 

 



 

 

위의 visual studio 12.0의 include 파일에 들어있는 stdio.h 파일이다.

그럼, stdio.h 파일이 무엇이길래 먼저 처리하도록 지시하는 것일까?

 

stdio.h 파일은 Standard Input Output 의 입출력 해더파일이다.

컴파일러가 인간의 언어를 기계어로 바꾸는 과정을 수행하기 전에, 이 코드를 해석 가능하게 하기 위한

입출력 -printf(), scanf() 등- 문법을 미리처리하도록 하는 것이다.

 

tip. main()함수를 호출하고 종료시키는 일을 하는 것은 운영체제이다.

운영체제는 window xp, unix 등이고, 컴퓨터와 프로그램 사이를 원활하게 해주는 인터페이스(interpace) 역할을 한다.

 

 

> # define

 

#define으로 시작하는 전처리 문장을 매크로라고 한다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
 
#define byte int
#define name "조원우"
#define add(x,y) x*y
 
void main()
{
 
    byte a,b;
 
    scanf("%d,%d",&a,&b);
 
    printf("%s",name);
 
    printf("%d",add(a,b));
 
}
 
 
cs


 

1. #define byte int

"byte를 int 자료형으로 정의하겠다"를 의미한다. 즉,  int a; 라고 변수선언해야 할 것을, byte a; 라고 선언해도 이상이 없다는 것이다.

 

2. #define name "조원우"

"name을 조원우로 정의하겠다"를 의미한다. 즉, printf("%s", "조원우"); 인 것을, printf("%s", name); 으로 코딩해도 이상 없다.

 

3. #define add(x, y) x*y

"add(x, y)라는 함수는 x와 y를 곱한 것으로 정의한다" 를 의미한다. printf("%s", add(x, y)); 를 코딩하면, 곱한 값이 나온다.

 

#define은 여러가지 역할을 수행한다. 상수를 치환하고(2번), 자료형 -int, char, double- 을 정의하고(1번), 함수를 정의한다(3번). 나아가 #if, #ifndef 는 매크로 정의가 됬는가를 여부로 조건부 전처리를 수행한다.

 

 


 

 

> # if ()

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
 
#define DEFINES 1
 
void main()
{
    int num01 = 1, num02 = 2;
 
#if(DEFINES==1)
    printf("%d",num01*num02);
#elif(DEFINES ==0)
    printf("%d",num01/num02);
#else
    printf("%d",num01+num02);#
#endif
}
 
 
cs


 

1. #define DEFINES 1

"DEFINES 를 1로 정의한다"를 의미한다.

 

2. #if(DEFINES ==1)

"DEFINES 가 1이라면, printf() 를 수행해라"를 의미한다. 미리 정의된 DEFINES 의 값에 따라,

 #if 전처리기가 수행 될 수도 안 될 수도 있다.

 

3. #elif(DEFINES ==0)

"위의 조건이 다르고, DEFINES ==0이라면 아래 printf()를 수행해라"를 의미한다.

 

조건식이 참이면 해당되는 코드를 수행하고, 조건식이 거짓이면 건너띄는 구조이다.

 

 

> # ifndef

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<stdio.h>
 
#ifndef MUL
 
#define MUL
#endif
 
 
void main()
{
    int num01 = 1, num02 = 2;
 
#ifdef MUL
    printf("%d",num01/num02);
#endif
 
#ifndef MUL
    printf("%d",num01*num02);
#endif
 
}
 
 
cs

 

 

1. #ifndef MUL

"매크로 상수 MUL이 정의되어 있지 않다면 MUL을 만들어라" 를 의미한다. 아직, 치환 단계가 아닌, 만들기만 한 것이다.

 

2. #ifdef MUL

"매크로 상수 MUL이 정의되어 있다면, MUL을 다음과 같이 치환해라" 를 의미한다. MUL은 1*2로 2로 치환될 것이다. 이 함수는 MUL이 num*num1이라고 정의하지 않지만, 자동으로, MUL을 인식하기 때문에 따로 정의할 필요가 없다.

 

3.#ifndef MUL

"매크로 상수 MUL이 정의되어 있지 않다면, 다음과 같이 MUL을 정의해라" 의미한다.

 

 

전처리기는 크게 3가지 유형이다. 헤더파일을 전처리하는 것, 메크로를 처리하는 것, 조건부 처리하는 것 이렇게 3가지 유형이다. 

프로그램 상, 절대 변하지 않을 수치를 쉽게 치환 하고 싶거나,

 함수를 간단하게 정의할 때나,

 이런 것들을 재정의 하여 오류가 뜨지 않도록 코딩 할 때,

 전처리기가 필요하다.



출처 및 참고 : http://baeseonha.tistory.com/entry/C%EC%96%B8%EC%96%B4%EA%B8%B0%EC%B4%88-%EC%A0%84%EC%B2%98%EB%A6%AC%EA%B8%B0%EB%9E%80

'프로그래밍 > Language' 카테고리의 다른 글

C언어 연산자에 대하여  (0) 2016.02.23
상수란 무엇인가?  (0) 2016.02.22
변수란 무엇인가?  (0) 2016.02.22
#Pragma의 사용법  (0) 2016.02.22
C언어를 배워야 하는 이유  (0) 2016.02.22
Posted by 시리시안