Programming/C Basic

3. C 언어 - 기본 전처리기

양디 2016. 1. 8. 14:15

c programming

PreCompiler

written by YangD


이미지 출처 : http://www.pskills.org/c.jsp



전처리기 ?

전(前)처리기 는 영어로 PreCompiler 라고도 합니다.

영어를 보자면, 컴파일 전의 것 이라고 해석할 수 있겠네요.


C 소스 코드가 실행 파일로 바뀌는 것, 즉 High-level 언어가 Low-level 언어로 바뀌는 것을 컴파일이라고 합니다.


전처리기는 언어마다 방식이 다를 수 있으며,

C에서는 # 표시가 들어가는 것이 전처리기 입니다.


컴파일러가 컴파일을 시작하기 전에 먼저 처리해주는 것이라고 생각하시면 됩니다.


또 하나의 특징으로는, 전처리기는 문장을 끝낼 때에 세미콜론(;)을 붙이지 않습니다.


#include

C에는 여러가지 전처리기들이 존재합니다.


가장 기본적인 전처리기는 바로 #include 입니다.


첫번째 포스팅에서 작성했던, first.c 내용을 다시 재활용해봅시다.


1
2
3
4
5
#include <stdio.h>
 
void main() {
    printf("Hello Dalkom IT!\n");
}
cs


1번 라인에 #include가 사용된 것을 볼 수 있습니다.

영어 단어 그대로, 뒤에 '파일을 포함한다' 라는 기능을 갖고 있습니다.


중요한 점은, 뒤에 파일의 종류가 2가지로 나뉜다는 것입니다.

첫번째로 표준 라이브러리로 C 언어의 표준으로 정해져있는 헤더파일들이 있습니다.

이러한 라이브러리들은 파일 이름을 <>로 감쌉니다. 


위의 stdio.h 파일은 표준 입출력 라이브러리 파일이기 때문에 <stdio.h>로 감싸져 있네요.


두번째로 비표준 파일(사용자 개인들 임의의 파일)들은 ""(큰따옴표)로 감쌉닌다.

이런 파일들은 큰따옴표 내부에 절대 경로(파일의 전체 주소) 혹은 상대 경로로 표시해줄 수 있습니다.

같은 폴더에 있다면 그냥 파일명만 넣어도 됩니다. 한번 실습해 봅시다.


먼저 second.c , second.c 파일 두개를 만들고 다음의 코드를 입력합니다.


<second.h>

1
int a = 5, b = 10;
cs


<second.c>

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include "second.h"
 
void main() {
    int c;
    c = a + b;
    
    printf("%d + %d = %d\n", a, b, c);
}
cs


second.h 파일에는 변수를 선언하고, second.c 파일에서 2번 줄에 #include로 파일을 가져옵니다.

그 후에 아래에서 덧셈 연산과 출력을 하는 파일입니다.



보면 second.c 파일에는 a와 b 변수가 선언되어 있지 않음에도 a와 b를 이용하는 것이 가능하다는 것을 볼 수 있습니다.


컴파일러는 컴파일을 시작하기 전에 전처리기부터 실행을 합니다. 


위의 second.c를 컴파일 실행하면 아래 사진과 같은 과정을 거쳐서 다음의 코드로 바뀌게 됩니다.


1
2
3
4
5
6
7
8
9
//stdio.h 파일 내용들이 쭉 들어감
int a = 5, b = 10//second.h 파일 내용!
 
void main() {
    int c;
    c = a + b;
    
    printf("%d + %d = %d\n", a, b, c);
}
cs


stdio.h 파일 내용이 궁금하신 분은 한번 직접 찾아보셔도 됩니다 ! 나중에 정리할 예정입니다.

위의 코드에서 처음보는 용도의 기호가 사용되었네요. // 표시인데요, 주석 처리입니다.

// 뒤의 내용들은 컴파일할 때에 컴파일러가 읽을 수 없습니다. 코드에 관한 메모를 할 때에 //를 사용합니다.

ex) int count; //갯수를 세는 변수

한줄로 메모를 끝낼 수가 없을 때에는 ,

/*   */ 주석을 사용합니다.

/*은 주석 시작이고, */는 주석 끝입니다. 안의 내용에 엔터든 뭐든 다 들어갈 수 있습니다.

ex)

/* 프로그램 이름 : 전처리기 연습

프로그래머 : 달콤 IT

날짜 : 2016.01.08  */



#define

#define은 상수나, 매크로를 정의하는 전처리기입니다.


예제부터 보고 시작합시다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
//#include "second.h"
#define A 5
#define B 10
#define PLUS(x,y) x+y
 
void main() {
 
    int c;
 
    c = PLUS(A, B);
    
    printf("%d + %d = %d\n", A, B, c);
}
cs


위에서 썼던 second.c를 조금 바꿔보았습니다.

include는 제외하기위해 주석처리하였습니다.

3,4,5 번이 핵심입니다.


#define을 통하여 A를 5로 정의하고, B를 10으로 정의하였습니다.

또한 plus(x,y)를 x+y 라는 것으로 바꾸게 하였습니다.


중요한 점은 define은 변수가 아니기 때문에, 함수 내부에서 임의로 값을 수정할 수 없다는 것입니다.

또한 구분하기 위하여 대문자로만 이름을 작성합니다. 


문법은

#define [매크로이름] [매크로 속성] 입니다.

변수 선언처럼 등호(=)를 사용해서 선언하지 않는다는 것도 큰 특징입니다.


위의 내용을 실행해보면, 여태 만들었던 프로그램들과 똑같은 출력이 나온다는 것을 알 수 있습니다.


저것을 실행하게되면 컴파일러는 코드를 다음과 같이 바꾸게 됩니다.


1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
void main() {
 
    int c;
 
    c = 5 + 10;
    
    printf("%d + %d = %d\n"510, c);
}
cs


변경 전 코드의 2번 줄은 주석처리 되었으므로 사라집니다. 

3번 줄은 코드 내부에서 A라는 글자를 5로 바꾸고 사라지고, 4번 줄도 B라는 글자를 10으로 바꾸고 사라집니다.

5번 줄은 PLUS(x,y) 와 같은 형식으로 되있는 코드를 찾아서 x + y 라는 내용으로 바꾸고 사라집니다. 변경 후 코드의 7번 줄이죠.


따라서 변경 후의 코드 모습이 나오게 됩니다.


마치며..

사실 위의 2가지 전처리기는 가장 기초적인 전처리기라고 할 수 있습니다.


이 외에도 전처리 조건문인 #ifdef, #endif, #if #ifndef 등 이나, #pragma 등 더 많은 전처리기가 있습니다만, 


나중에 조금 더 공부한 뒤에 보아야 더 이해가 빠를거라고 생각합니다 !


오늘도 직접 코딩해보세요~




Point !

#include : 파일을 통째로 가져온다.

#define : 매크로, 상수 선언




댓글