マルチソースファイル構成のCプログラム

Copyright(C) 14May2003 coskx

プログラムが大規模になり,関数の数が多くなると,関連する関数群ごとにまとめて別なソースファイルしてプログラムを作成することになる。
この場合関数のプロトタイプをヘッダファイル(「〜.h」という名前のファイル
)に記述し,関数群の定義が書いてあるファイルとその関数群を使用するファイルの両方にインクルードする。

「#include "xxxx.h"」というのは,ファイル「xxxx.h」の内容が「#include "xxxx.h"」の位置に書いてあることとしてコンパイルしなさいの意味である。

コンパイラメーカが配布しているライブラリ関数に関連するヘッダファイルは「#include <stdio.h>」のように書くが,自分で作成した関数群のヘッダファイルは「#include "xxxx.h"」のように分けて書く場合がある。すべて「<>」またはすべて「""」でくくってもよい。

以下にマルチソースファイルで作成した四則演算関数(むりやり2つずつに分けている)を示し,マルチソースファイルでのプログラミングの書き方を示す。

main.c

#include <stdio.h>
#include "sub1.h"
#include "sub2.h"

int main()
{
    int x=12,y=4,z;
    z=addVariables(x,y);
    printf("add(%d,%d)      = %d\n",x,y,z);
    z=subtractVariables(x,y);
    printf("subtract(%d,%d) = %d\n",x,y,z);
    z=multiplyVariables(x,y);
    printf("multiply(%d,%d) = %d\n",x,y,z);
    z=divideVariables(x,y);
    printf("divide(%d,%d)   = %d\n",x,y,z);
    return 0;
}

sub1.h
int addVariables(int x,int y);
int subtractVariables(int x,int y);
sub1.c

#include "sub1.h"

int addVariables(int x,int y)
{
    return x+y;
}

int subtractVariables(int x,int y)
{
    return x-y;
}

sub2.h
int multiplyVariables(int x,int y);
int divideVariables(int x,int y);
sub2.c

#include "sub2.h"

int multiplyVariables(int x,int y)
{
    return x*y;
}

int divideVariables(int x,int y)
{
    return x/y;
}

実行結果
add(12,4)      = 16
subtract(12,4) = 8
multiply(12,4) = 48
divide(12,4)   = 3

マルチソースファイルでのプログラミングは一般的には次のようなファイル構成となる。
「〜.h」には,元になる「〜.c」に定義されている関数のプロトタイプ宣言が書いてあり,関数が使われる「〜〜.c」にインクルードされるように使われる。なお,例えばsub3.cに定義されている関数がsub2.cで使われるなら,sub2.cにsub3.hをインクルードする必要がある。

main()を含むソース sub1.c sub2.c sub3.c

#include <...>
#include "sub1.h"
#include "sub2.h"
#include "sub3.h"

int funcm1(...)
{
    :
}

int funcm2(....)
{
    :
}

    :

int main()
{
    :
}

#include <...>
#include "sub1.h"

int func11(...)
{
    :
}

int func12(....)
{
    :
}

    :

#include <...>
#include "sub2.h"

int func21(...)
{
    :
}

int func22(....)
{
    :
}


    :
#include <...>
#include "sub3.h"

int func31(...)
{
    :
}

int func32(....)
{
    :
}


    :
  sub1.h sub2.h sub3.h
  int func11(...);
int func12(...);
    :
int func21(...);
int func22(...);
    :
int func31(...);
int func32(...);
    :