12.1 コンパイルと分割統治

  2.分割コンパイルのためのソースファイル分割
 Cコンパイラ(例えば GNU gcc)は、指定されたソースファイルに対し、文法的な問題がなく、かつ、必要な関数が揃っている条件の下、最初にソースファイルをコンパイルし、オブジェクトファイルを生成します。次にそれらのオブジェクトを結び付け(リンクし)て、ロードモジュール(例えば a.out)を生成します。

 以下、サンプルプログラム maxline(標準入力のうち、最大長さを持った行番号と内容を表示する toy program)を例に挙げ、分割コンパイルのためのソースファイル分割とビルドの方法について説明していきます。このプログラムは、ヘッダファイル maxline.h、ソースファイル main.c, sgetline.c, scopy.c に分割されています(以下、Cコンパイラは GNU gcc を用います) 。
<ヘッダファイル maxline.h

#define MAX 10000

int sgetline(char s[ ]);
void scopy(char dist[ ], char source[ ]);

<ソースファイル main.c

#include <stdio.h>
#include "maxline.h"

int main(void)
{
  int len, max;
  char line[MAX], longest[MAX];
  
  max = 0;
  while ((len = sgetline(line)) > 0) {
    if (len > max) {
      max = len;
      scopy(longest, line);
    }
  }
  if (max > 0) {
    printf("%d: %s", max, longest);
  }
  return 0;
}

<ソースファイル sgetline.c

#include <stdio.h>
#include "maxline.h"

int sgetline(char s[ ])
{
  int c, i;

  for (i=0; i<MAX-1 && (c=getchar())!=EOF && c!='\n'; ++i) {
    s[i] = c;
  }
  if (c == '\n') {
    s[i] = c;
    ++i;
  }
  s[i] = '\0';
  return i;
}

<ソースファイル scopy.c

void scopy(char dist[ ], char source[ ])
{
  int i;

  i = 0;
  while ((dist[i] = source[i]) != '\0') {
    ++i;
  }
}