본문 바로가기
Ghost의 Linux C Note(노트)/Ghost의 Linux C언어 분할 컴파일

이제 한걸음 더?~~~

by dark ghost 2012. 5. 15.
728x90
반응형

함수 분할 컴파일.

 

1. 위 그림은 b.h라는 헤더 파일이다.

#ifndef  __B_H__
#define __B_H__

2. 헤더 파일이 겹치는 것을 막기 위한 일종의 매크로이다. 예를 들어, 헤더 파일에 어떤 클래스의 인터페이스 선언을 하고 이 클래스 인터페이스에서 다른 파일의 프로토타입이 필요해서 다른 A 파일을 include 하고 있는데 이 헤더 파일을 include 하는 파일에서 A라는 헤더 파일을 이미 include 하고 있다면 두번 define한 것이 된다. 그러면 SYNTEX 에러가 난다. 그래서 그런 것을 막는 방법의 하나로 #ifndef을 사용한다. 이전에 include되어 있으면 #endif 쪽으로 점프해 버려 결국 한번 선언되는 것이다.
#include <stdio.h> ------ (a)
#include <stdio.h> ------ (b)

이렇게 두번 썼다고 하면 앞에 이미 include를 했는데 밑에 또 한다면 문제가 된다. 컴파일러가 검사해야할 코드량도 많아진다. 그래서 stdio.h에는
#ifndef STDIO_H__
#define STDIO_H__
가 선언되어 있다. 만약 STDIO_H가 선언되어 있지 않다면 선언한다는 뜻이다. 그 뒤 (b)에서는 이미 (a)쪽에서 STDIO_H__ 을 선언한 상태이기 때문에 전처리기 쪽에서 무시해버린다. 그러므로 컴파일러는 (a)만 검사한다.

#endif  // __B_H__

3. ifndef의 마지막에 꼭 넣어야 이헤더가 종료가 된다. ifndef 와는 한 세트라고 생각 하면 좋을 것이다.

 

 4. a.c 의 소스다. 전처리로 "b.h"라는 헤더 파일을 미리 실행 시킨다.

  #include "b.h" 

 5. #include "b.h"는 현재 디렉토리에서 헤더 파일을 찾아서 실행 시키겠다는 것이다.

 avrg = average (inum1, inum2);

6. 이 구문은 avrg에 average라는 함수를  호출하여 넣겠다는 것이다. (inum1, inum2)는 인수 리스트로 실인수(actual parameter)라고 하는데 호출하는 함수에인수를 넘겨 주는 인자이다.

printf("The average of %f and %f is %6.3\n", inum1, inum2, avrg);

7. 6번째 구문에서 호출했던 함수를 avrg 에서 받게 되면 마지막으로 inum1과 inum2 그리고 avrg의 값을 실수형으로 출력 시킨다.

 

8. b.c의 소스이며, 실질적인 평균을 구하는 부분을 가지고 있다.

#include "b.h"

9. 역시 b.h 헤더 파일을 현재 디렉토리에서 찾아서 먼저 실행시키겠다는 전처리 구문이다.

float average (short n1, short n2)

10. 실수형 average 라는 함수를 선언하였고 (short n1, short n2 )를 가지는 인수 리스트에 main 함수에서 전달 받은 인자 inum1, inum2 를 넣게 된다. 전달받은 인수를 형식인수(formal parameter)라 한다. 전달 받는 인자의 개수는 전달하는 인자의 개수 만큼 만들면 된다.

{

float avg;

avg = (float)(n1 + n2) / 2;

return (avg);

}

11. 실수형 avg 변수를 선언하고 avg 변수에 n1과 n2라는 인자의 값들을 더해서 실수형으로 캐스팅하고 2로 나누어 주므로서 평균을 구하는 식을 넣는다. 그리고 마지막으로 return (avg); 는 avg 값을 main 함수에 반환한다.

 

12. gcc -c 파일명.c 라는 명령어로 오브젝트 파일을 생성한다. 3개의 파일 모두 확장자가 ".o "로 끝나는 오브젝트 파일들을 생성 해서 gcc -o 파일명 파일명.o 파일명.o 파일명.o 를 실행 시켜서 실행파일을 생성 시킨다. 왜 오브젝트파일을 생성시켜야 하냐면 각 함수들은 독립적이어서 오브젝트 파일 생성 까지는 되지만 링크는 걸리지 않는다. 그래서 ".o" 파일 들을 생성 시켜서 그 파일들을 묶어줘야 링크가 걸려 실행 파일이 생성된다.  

728x90
반응형

댓글