はじめに
規模の大きなプログラムを設計していると、ついついコード量が多くなります。そうなるとチームで開発することが、求められますとね。そういった時に必要になるのが「ソースコードの分割」です。
- ソースコードの分割とはどういうことなのか?
- どのように分割するのか?
- ヘッダーファイル、ソースファイルの意味とは?
について初心者向けにわかりやすく解説したいと思います。
ソースコードの分割とは?
コード例
以下のコードをソースコート分割してみます。
#include <stdio.h>
// 関数avgのプロトタイプ宣言
double avg(double, double);
int main(int argc, char** argv) {
double d1, d2, d3;
double a = 1.2, b = 3.4, c = 2.7;
// 同じ計算を3回
d1 = avg(a, b);
d2 = avg(4.1, 5.7);
d3 = avg(c, 2.8);
printf("d1 = %f,d2 = %f,d3 = %f\n", d1, d2, d3);
return 0;
}
// 平均値を求める関数
double avg(double m, double n) {
// 引数m,n rに平均値
double r = (m + n) / 2.0;
return r;
}
こちらのコードは、mainとavgの二つの関数からなりたっています。
ソースコード分割をするには、ヘッダーファイルとソースファイルという概念を理解する必要がありますので、解説します。
- ヘッダーファイルとは、拡張子が.hのファイルを指します。このファイルは、プロトタイプ宣言をするファイルです。
- ソースファイルとは、(ヘッダーファイルで呼び出された)関数の内容を記述するファイルです。
ソースコート分割
以下三つに分割します。
calc.h
ヘッダーファイルで大切なのが、二重インクルードの防止です。複雑なプログラムを開発していると、ヘッダファイルを2重にincludeしてしまい、コンパイルエラーとなることがあります。それを防止するのが、以下の方法です。
一回目のインクルードは、#ifndef _CALC_H_が実行されていないので、#ifndef _CALC_H_と#endif // _CALC_H_の間の処理が実行されいます。
二回目のインクルードでは、#define _CALC_H_と#endif // _CALC_H_の間の処理が実行されないという意味です。
これが二重インクルード防止です。
#ifndef _CALC_H_
#define _CALC_H_
// 関数avgのプロトタイプ
double avg(double, double);
#endif // _CALC_H_
calc.c
#include "calc.h"
// 平均値
double avg(double m, double n) {
double r = (m + n) / 2.0;
return r;
}
main.c
#include <stdio.h>
#include "calc.h"
int main(int argc, char** argv) {
double d1, d2, d3;
double a = 1.2, b = 3.4, c = 2.7;
d1 = avg(a, b);
d2 = avg(4.1, 5.7);
d3 = avg(c, 2.8);
printf("d1 = %f,d2 = %f,d3 = %f\n", d1, d2, d3);
return 0;
}
分割コンパイル
次に分割コンパイルについて説明します。
以下の上から順番にターミナルにて実行してください。
cc -c main.c
cc -c calc.c
cc -o sample main.o calc.o
./sample
上記第1行と第2行のコマンドラインでは、それぞれオブジェクトファイル main.o と calc.o が生成されます。次のコマンドラインでこれらのオブジェクトファイルがリンクされて実行ファイル “sample” が生成されます。
./sampleにて実行することができます。
出力結果
d1 = 2.300000,d2 = 4.900000,d3 = 2.750000
もっと詳しくC言語を学習したい方は以下の記事を参考にしてみてください。オンライン学習サイトUdemyのおすすめ講座についてまとめたものです。
筆者がC言語の学習は以下の本がおすすめです。参考にしてみてください。
コメント