공돌하우스

c언어 전처리기 본문

C_Language

c언어 전처리기

전자둥이 2021. 7. 11. 23:26

전처리기란?

 

- 다른 프로그램 영역과 독립적으로 처리해주는 기능

- 소스코드 파일 단위로 효력이 존재

 

이렇게만 표현하면 확 와닿지 않을겁니다!

좀 더 쉽게 표현하자면 #define처럼 치환의 역할을 하기도 하고, 디버깅에도 도움을 주며 헤더파일의 중복 포함도 방지해주는 놈이라고 생각하시면 됩니다.

그리고 전처리기에는 다양한 종류가 있는데 한번 살펴보도록 하겠습니다.

 

파일 포함 전처리기

 1) #include는 전처리기에서 가장 많이 사용되는 문법입니다.

 2) 특정한 파일을 라이브러리로서 포함시키기 위해 사용합니다.

 3) #include 구문으로 가져 올 수 있는 파일에는 제약이 없습니다.

 

형태

#include "파일 이름"

 - 현재 폴더에서 파일을 먼저 검색합니다.

 - 만약 현재 폴더에 파일이 없다면 시스템 디렉토리에서 파일을 검색해서 가져옵니다.

 

#include <파일 이름>

 - 시스템 디렉토리에서 파일을 검색합니다.

 - os마다 시스템 디렉토리가 존재하는 경로가 다를 수 있습니다.

 - 예를 들어 stdio.g string.h 등이 있습니다.

 

 

이번에는 직접 헤더파일을 만들어보고 적용해봅시다!

 

#temp.h

-----------------------------------------------

int add(int a, int b){

    return a + b;

}

-----------------------------------------------

 

다음과 같이 temp.h를 해당 소스코드가 있는 디렉토리에 만들어주고

 

소스코드

------------------------------------------------

#include <stdio.h>

#include "temp.h"

 

int main(){

    int a = 10,  b = 5;

    printf("%d\n", add(a+b));

    return 0;

}

--------------------------------------------------

 

다음과 같이 소스코드에 #include "temp.h"를 선언해주면 add함수를 사용할 수 있게 됩니다.

 

여기서 주의할 점은 똑같은 헤더파일이 중복처리되지 않도록 하는것입니다.

 

매크로 전처리기

 - 프로그램 내에서 사용되는 상수나 함수를 매크로 형태로 저장하기 위해 사용됩니다.

 - #define 문법을 사용해 정의할 수 있습니다.

 

매크로 전처리기 사용하는 이유로는 소스코드의 양을 획기적으로 줄이는데 사용됩니다.

 

예를 들어 

#define ll long long

#define ld long double

이렇게 사용하여 long long 이나 long double을 ll 또는 ld로 표현할 수 있게 합니다.

 

조건부 컴파일

 - 컴파일이 이루어지는 영역을 지정하는 기법입니다.

 - 일반적으로 디버깅과 소스코드 이식을 목적으로 하여 작성됩니다.

 - C언어로 시스템 프로그램을 작성할 때에는 os에 따라서 소스코드가 달라질 수 있습니다.

 - 이 때 운영체제에 따라서 컴파일이 수행되는 소스코드를 다르게 할 수 있습니다.

 

예를 들어 앞서서 헤더파일이 중복처리 되지 않게 하기 위해서 조건부 컴파일을 사용할 수 있습니다.

 

#temp.h

----------------------------------------

#ifndef _TEMP_H_

#define _TEMP_H_

int add(int a, int b){

    return a + b;

}

#endif

-----------------------------------------

이렇게 작성하면 헤더파일 중복처리를 예방 할 수있습니다.

 

파일 분할 컴파일

헤더파일과 c언어 문법을 나눠서 정리 할 수 있습니다.

앞서서 작성한 헤더파일을 예시로 설명 드리겠습니다.

 

#temp.h

----------------------------------

#ifndef _TEMP_H_

#define _TEMP_H_

int add(int a, int b)

#endif

----------------------------------

 

 

#temp.c

----------------------------------

#include "temp.h"

int add(int a, int b){

    return a + b;

}

-----------------------------------

 

다음과 같이 앞선 헤더파일을 저렇게 두개의 소스코드파일과 헤더파일로 나누어서 관리할 수 있습니다.

 

이상으로 전처리기를 알아보았습니다.

전처리기가 필수는 아니지만 이식성과 소스코드를 획기적으로 줄일 수 있는 방법이기 때문에 알아두면 좋습니다!