[KNK] CH15 - Writing Large Programs

2 분 소요

CH15 Wrting large programs

Source Files

  • 각 소스 파일은 main 함수가 있어야 한다.
  • 관련 있는 함수와 변수들은 같은 소스파일에 있어야 한다.

소스파일을 나누는 것의 장점

  • 프로그램의 구조를 이해하는데 유용하다.
  • 각 소스파일을 따로 컴파일 할 수 있다. (컴파일 시간 단축)
  • 소스파일을 재사용할 수 있다.

Header Files

헤더파일의 구성 요소

  1. 함수 prototype
  2. 매크로 정의
  3. 타입 정의

#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이 수행된다.

링킹 중 발생하는 에러

  1. 스펠링 틀림
  2. 없는 파일
  3. 없는 라이브러리(math.h에서 많이 발생)

프로그램 빌드 다시하기

  • 소스파일 하나만 수정했으면 수정한 파일만 다시 컴파일한다.
  • 헤더 파일을 수정했으면 수정한 헤더 파일을 포함한 모든 소스파일을 다시 컴파일 해야 한다.

프로그램 밖에서 매크로 선언하기

  • 매크로 설정: gcc를 터미널에서 실행할 떄 -D[매크로이름] 옵션을 준다.
    • 예를 들어, -DDEGUS=1 은 #define DEBUG 1 와 동일하다. (값을 정해주지 않으면 1이다.)
  • 매크로 해제: -U 은 #undef를 의미한다.

댓글남기기