예전 아두이노 라이브러리 파일을 만들 때 간단히 소개 한적이 있습니다. 이번 C post를 쓰면서 정리하는 차원으로 다시 복습을 할까 합니다.
먼저 C언어에서 기본 제공되는 라이브러리 파일 속에 어떤 함수들이 있고 어떻게 코딩이 되어 있는지 찾아볼 수 있는 방법을 설명하겠습니다. C 에디터 프로그램을 설치하면 설치한 폴더 내부에 라이브러리 파일을 검색하셔서 열어 볼 수 있지만 쉽게 인터넷에서 찾는 방법을 소개 합니다.
예로, 수학함수들이 들어 있는 math.h 파일을 찾아 볼까요.
여러분들은 살펴보고 싶은 라이브러리 파일을 방금 했던 방식으로 검색하시면 됩니다.
라이브러리 파일의 구조는 다음과 같습니다.
파일명.h
파일명.cpp
이렇게 두개의 파일로 구성됩니다. 인크루드는 파일명.h 파일로 접근합니다. 그리고 파일명.cpp은 파일명.h 헤더파일을 인크루드를 해야 합니다.
예)
[cal.h]
int ADD(int a, int b);
[cal.c]
#include "cal.h"
int ADD(int a, int b){
return a+b;
}
이렇게 표현을 할 수 있습니다. 헤더(h)파일에서는 함수 원형을 정의하고 c 파일에서는 해당 함수의 전체 코딩을 표현합니다.
이렇게 cal.h와 cal.c 파일로 ADD()함수를 정의해 놓은 것이 라이브러리 파일입니다. 이걸 사용하기 위해서는 main.c 파일에서는 다음과 같이 접근 합니다.
[main.c]
#include
#include "cal.h"
int main(int argc, char *argv[]) {
int total;
total=ADD(1,2);
printf("%d \n",total);
return 0;
}
이렇게 "cal.h" 파일을 인쿠르드 하면 해당 함수를 사용 할 수 있습니다.
라이브러리 파일들을 인쿠르드를 하다보면 파일과 파일들 사이에서 연속으로 같은 라이브러리 파일을 인쿠르드 될 수 있습니다. 그걸 막기 위해서 한가지 표현을 락을 걸어 놓습니다.
[cal.h]
#ifndef CAL_H
#define CAL_H
int ADD(int a, int b);
#endif
이렇게 표현을 함으로써 락이 걸립니다.
#ifndef CAL_H
함수들;
#endif
CAL_H가 중복되는지 체크하게 됩니다. 없으면 안의 내용을 처리하게 됩니다. 이때 이 함수들을 참조하기 때문에 이 함수들을 다시 참조하지 않기 위해서 다음과 같이 매크로 define으로 정의해 놓습니다.
#ifndef CAL_H
#define CAL_H
#endif
이렇게 CAL_H를 정의해놓으면 다시 해당 헤더(h)파일을 혹시 인쿠르드 하게 된다면 CAL_H로 매크로 정의해 놓았기 때문에 중복 체크로 해당 함수들을 중복참조하지 않게 됩니다. 일종의 락 개념으로 보시면 되겠죠.
라이브러리 파일을 만들고 완성을 시켜서 실행하여 정상적으로 처리되는지 보도록 하죠.
프로젝트 폴더에 만든 라이브러리 파일을 같은 경로 위치에 둡니다. 에디터에서 설치 된 라이브러리 폴더에 삽입해도 되지만 간단히 직접 만든 라이브러리를 그곳에 삽입해 놓기는 좀 그렇죠. 그래서 프로젝트가 만들어진 같은 경로 위치에 만든 라이브러리 파일을 이동시켜놓으시면 됩니다. 위 그림처럼 project1 폴도에 3개의 파일이 있게 합니다.
[cal.h]
#ifndef CAL_H
#define CAL_H
float ADD(float a, float b);
float SUB(float a, float b);
float MUL(float a, float b);
float DIV(float a, float b);
#endif
[cal.c]
#include "cal.h"
float ADD(float a, float b){
return a+b;
}
float SUB(float a, float b){
return a-b;
}
float MUL(float a, float b){
return a*b;
}
float DIV(float a, float b){
return a/b;
}
[main.c]
#include
#include
#include "cal.h"
int main(int argc, char *argv[]) {
float a,b;
char op;
float total;
float (*Cal)(float,float);
scanf("%f %c %f",&a,&op,&b);
switch(op){
case '+': Cal=ADD; break;
case '-': Cal=SUB; break;
case '*': Cal=MUL; break;
case '/': Cal=DIV; break;
}
total=Cal(a,b);
printf("%0.0f %c %0.0f = %0.1f\n",a,op,b,total);
system("pause");
return 0;
}
포인트 함수에서 사용한 전체 소스에서 Cal()함수로 사칙연산을 수행하는 함수들을 라이브러리 파일로 만들었네요.
[결과]
1+2의 결과가 정상적으로 나왔네요.
간단히 라이브러리 파일을 만들어 보았습니다. 라이브러리 파일을 만드는 목적은 뭔가 체계적으로 정리한 특정 목적을 가진 함수들을 묶어 줌으로써 나중에 해당 함수들을 쉽게 접근하여 사용하기 위해서 입니다. 라이브러리 파일을 부품박스라고 생각하시고 안에 들어 있는 함수들을 부품이라고 생각하시면 됩니다. 뭔가를 만들 때 필요한 부품들을 만들어 사용하는 것보다 부품 박스에서 꺼내서 쓰는게 더 효율적이겠죠. 이런 의미로 라이브러리 파일을 이해하시면 됩니다.