[KNK] CH15 - Writing Large Programs
CH15 Wrting large programs
Source Files
- 각 소스 파일은 main 함수가 있어야 한다.
- 관련 있는 함수와 변수들은 같은 소스파일에 있어야 한다.
소스파일을 나누는 것의 장점
- 프로그램의 구조를 이해하는데 유용하다.
- 각 소스파일을 따로 컴파일 할 수 있다. (컴파일 시간 단축)
- 소스파일을 재사용할 수 있다.
Header Files
헤더파일의 구성 요소
- 함수 prototype
- 매크로 정의
- 타입 정의
#include Directive
- 표준 라이브러리를 사용하는 경우
#include <file_name>
- 시스템의 헤더파일이 있는 디렉토리부터 찾는다.
- 그 외의 헤더파일은
#include "file_name"
- 현재 디렉토리 부터 찾은 다음 시스템 라이브러리를 찾는다.
// window: #include "c:\cprogs\utils.h" #include "..\include\utils.h" // UNIX: #include "/cprogs/utils.h"
- 현재 디렉토리 부터 찾은 다음 시스템 라이브러리를 찾는다.
- preprocessor doesn’t treat as string literal, use relative directory not absolute one
#include tokens
#if defined(IA32)
#define CPU_FILE "ia32.h"
#elif defined(IA64)
#define CPU_FILE "ia64.h"
#elif defined(AMD64)
#define CPU_FILE "amd64.h"
#endif
#include CPU_FILE
함수 prototype 공유하기
- 헤더파일에 선언해주면 된다.
- 필요한 경우 #include전처리기를 이용해서 선언하면 된다.
공유할 변수의 선언
extern type identifier;
- 위와 같이 선언 가능(권장 하지 않음)
- 선언만 한 경우 메모리에 변수 할당이 안되고 초기화 하는 순간 할당된다.
- 서로 다른 파일 속에 type이 다른경우 unpredictably한 결과가 나온다.
Nested Includes
헤더파일이 다른 헤더파일을 include할 수 있다.(권장 하지 않음)
Protecting Header Files
예를 들어 file1.h가 file3.h을 포함하고 file2.h가 file3.h을 포함하고 소스 파일이 file1.h과 file2.h를 포함할 때 file3.h가 두번 컴파일 된다.(컴파일 에러)
(주의)여러 번 포함하는 것은 피해야 한다.
이를 방지 하기 위해 다음과 같이 한다.
#ifndef BOOLEAN_H
#define BOOLEAN_H
#define TRUE 1
#define FALSE 0
typedof int Bool;
#endif
이렇게 컴파일하면 이중으로 컴파일 하더라도 괜찮다.
-#error Directives in Header files- #ifndef STDC #error This header requires a Standard C compiler #endif 표준이 아닌 경우 에러가 뜬다.
Dividing a Program into Files
- 함수들은 소스파일에 넣는다.(foo.c)(include its header file)
- prototype은 헤더파일에 넣는다.(foo.h)
- main 함수를 포함한 소스파일의 이름은 프로그램의 이름과 같도록 한다.(예를 들면 bar.c, bar.exe)
Building a Multiple-File Program
컴파일과 링킹
- 컴파일: 모든 소스 파일을 object 파일로 만든다.
- 링킹: 모든 object 파일을 합쳐 하나의 바이너리로 만든다.
Makefile(gcc)
justify: justify.o word. line.o
gcc -o justify justify.o word.o line.o
justify.o: justify.c word.h line.h
gcc -c justify.c
word.o: word.c word.h
gcc -c word.c
line.o: line.c line.h
gcc -c line.c
- 각 그룹: 규칙
- 첫 번째 줄: 타겟 파일
- 두 번째 줄: 명령어(-c 옵션은 링킹하지 않고 컴파일만 한다는 뜻)
- 명령어가 있는 줄은 반드시 tab으로 공백을 만들어야 한다.
- 이 파일의 이름은 ‘makefile’ 또는 ‘Makefile’ 이어야 한다.
- 터미널에서 make [target] 를 입력하면 규칙에 따라 컴파일 및 링킹을 한다. target 매개변수를 주지 않으면 첫 번째 target이 수행된다.
링킹 중 발생하는 에러
- 스펠링 틀림
- 없는 파일
- 없는 라이브러리(math.h에서 많이 발생)
프로그램 빌드 다시하기
- 소스파일 하나만 수정했으면 수정한 파일만 다시 컴파일한다.
- 헤더 파일을 수정했으면 수정한 헤더 파일을 포함한 모든 소스파일을 다시 컴파일 해야 한다.
프로그램 밖에서 매크로 선언하기
- 매크로 설정: gcc를 터미널에서 실행할 떄 -D[매크로이름] 옵션을 준다.
- 예를 들어, -DDEGUS=1 은 #define DEBUG 1 와 동일하다. (값을 정해주지 않으면 1이다.)
- 매크로 해제: -U 은 #undef를 의미한다.
댓글남기기