Taking baby-developer steps
18. 전처리기 - 파일 포함 전처리기 / #include <파일 이름>/ #include "파일 이름" /헤더 파일 정의해서 사용하기 / 매크로 전처리기 / 인자를 가지는 매크로 전처리기 / 조건부 컴파일 / 파일 분할 컴.. 본문
18. 전처리기 - 파일 포함 전처리기 / #include <파일 이름>/ #include "파일 이름" /헤더 파일 정의해서 사용하기 / 매크로 전처리기 / 인자를 가지는 매크로 전처리기 / 조건부 컴파일 / 파일 분할 컴..
Surin Lee 2021. 4. 4. 01:10전처리기
전처리기는 프로그램을
- 이식성 높게
- 생산성 높게
- 안정적으로
개발하기 위해서 많이 사용한다.
전처리기 구문은 다른 프로그램 영역과 독립적으로 처리된다. 전처리기 구문은 소스코드 파일 단위로 효력이 존재한다.
소스코드를 빌드해서 실행파일이 만들어질 때 까지의 과정에서, 소스코드를 전처리기가 향상된 소스코드로 만드는데, 이 전처리 과정에서 사용되는 특별한 문법들에 대해서 학습한다.
파일 포함 전처리기
#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언어 파일과 헤더파일을 모두 작성해야 한다.