전처리기
- #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 |