Taking baby-developer steps

18. 전처리기 - 파일 포함 전처리기 / #include <파일 이름>/ #include "파일 이름" /헤더 파일 정의해서 사용하기 / 매크로 전처리기 / 인자를 가지는 매크로 전처리기 / 조건부 컴파일 / 파일 분할 컴.. 본문

CS 지식/C언어_basic

18. 전처리기 - 파일 포함 전처리기 / #include <파일 이름>/ #include "파일 이름" /헤더 파일 정의해서 사용하기 / 매크로 전처리기 / 인자를 가지는 매크로 전처리기 / 조건부 컴파일 / 파일 분할 컴..

Surin Lee 2021. 4. 4. 01:10

전처리기

전처리기는 프로그램을

  1. 이식성 높게
  2. 생산성 높게
  3. 안정적으로

개발하기 위해서 많이 사용한다. 

 

전처리기 구문은 다른 프로그램 영역과 독립적으로 처리된다. 전처리기 구문은 소스코드 파일 단위로 효력이 존재한다.

소스코드를 빌드해서 실행파일이 만들어질 때 까지의 과정에서, 소스코드를 전처리기가 향상된 소스코드로 만드는데, 이 전처리 과정에서 사용되는 특별한 문법들에 대해서 학습한다.

 

파일 포함 전처리기

#include는 전처리기에서 가장 많이  사용되는 문법이다. 특정한 파일을 라이브러리로서 포함시키기 위해 사용한다. #include 구문으로 가져 올 수 있는 파일에는 제약이 없다.

#include "파일 이름"
#include <파일 이름>

#include 이 구문 자체가 가져오는 파일의 소스코드로 완전히 대체된다는 특징을 가지고 있다. 이 구문은 어떤 외부파일을 그대로 현재 소스코드에 포함시키겠다는 의미를 가진다.

 

#include <파일 이름>

이와 같이 선언하면, 시스템 디렉토리에서 파일을 검색한다. 운영체제마다 시스템 디렉토리가 존재하는 경로가 다를 수 있다. 대표적으로 stdio.h와 같은 헤더 파일 등이 시스템 디렉토리에 존재한다.

 

#include"파일 이름"

이와 같이 선언하면, 현재 폴더에서 파일을 먼저 검색한다. 만약 현재 폴더에 파일이 없다면 시스템 디렉토리에서 파일을 검색한다.

 

나만의 헤더 파일 작성하기

#include를 이용해 가져오는 파일은 말 그대로 파일의 소스코드 자체를 다 가져오는 것이다. 따라서 의도치 않게 한 번 참조한 헤더 파일을 여러 번 참조하지 않도록 유의해야 한다.

//temp.h 로 시스템 디렉토리에 저장한 파일
int add(int a, int b){
	return a + b ;
}
#include <stdio.h>
#include <temp.h>

int main(void){
	printf("%d\n", add(3,7);
    system("pause");
    return 0;
}
10

 

매크로 전처리기

프로그램 내에서 사용되는 상수나 함수를 매크로 형태로 저장하기 위해 사용한다. #define 문법을 사용해 정의할 수 있다.

#include <stdio.h>
#define PI 3.1415926535

int main(void){
	int r = 10;
    printf("원의 둘레 : %f\n", 2 * PI * r);
	return 0;
}

 

인자를 가지는 매크로 전처리기

#define 문법에는 인자가 포함 될 수 있다.

#include <stdio.h>
#define POW(x)(x*x) //그냥 함수 정의하는 것과 동일함. 자주 사용하는 것을 미리 처리해두면 편리하다.

int main(void){
	int x = 10;
	printf("%d의 제곱 : %d\n", x, POW(x));
	system("pause");
	return 0;
}

#define 문법은 소스코드의 양을 획기적으로 줄이는 데 도움을 준다. 특히 시간이 촉박한 알고리즘 문제를 풀때 많이 이용한다.

#include <stdio.h>
#define ll long long
#define ld long double

int main(void){
	ll a = 123456789000;
    ld b = 100.5054;
    printf("%.1f\n", a * b);
	system("pause");
	return 0;
}

조건부 컴파일

조건부 컴파일은 컴파일이 이루어지는 영역을, 직접 매크로 형태로 지정하는 기법이다. 일반적으로 디버깅과 소스코드 이식을 목적으로 작성된다. C언어로 시스템 프로그램을 작성 할 때는 운영체제에 따라 소스코드가 달라질 수 있다. 이 때, 운영체제에 따라서 컴파일이 수행되는 소스코드를 다르게 할 수 있다. 조건부 컴파일은 소스코드의 이식성을 높이고자 할 때 사용한다.

 

#ifndef ~ #endif 문법은 대표적인 조건부 컴파일 문법이다. 흔히 헤더 파일의 내용이 중복되어 사용되지 않기 위해 적용한다. (if not define)

// temp.h 파일로 저장된 파일
#indef _TEMP_H_
#define _TEMP_H_
int add(int a, int b){
	return a + b;
}
#endif
#include <stdio.h>
#include "temp.h"
#include "temp.h"

int main(void){
	printf("%d\n", add(3,5));
	sustem("pause");
	return 0;
}

 

파일 분할 컴파일

일반적으로 자신이 직접 라이브러리를 만들 때는 C언어 파일과 헤더파일을 모두 작성해야 한다.

Comments