C言語を一切、全く学んだことのないiOSアプリ開発者が自作OS作るまで - 第17回

最小限の分割

今までまあ色々なコードを書いてきましたが。
全て一つのファイル[main.c]に書いてきましたよね。
ですが、規模の大きなプログラムをそれで書くのは見た目も中身も汚いです。
それに複数人での作業も行えません。というわけで複数のプログラムファイルを書きましょう。実はこれ、最初の最初からずっと私たちやってました。

#include < stdio.h>


これって何ですかね?
include.....取り込む......stdio.hを......はい、まさしくこれです。
stdio.hの様に宣言だけが書かれたファイルをヘッダー。
実際にプログラムを書くファイルをソースと言います。
今回は苦Cのコードを使わせていただきます。
main.c
#include <stdio.h>
#include "sum.h"

int main(void)
{
    int value;
    value = sum(50, 100);
    printf("%d\n",value);
    return 0;
}

sum.h
int sum(int min,int max);
sum.c
int sum(int min,int max)
{
    int num;
    num = (min + max) * (max - min + 1) / 2;
    return num;
}

この様にして分割することができます。
とても見やすいですよね。
一部のCコンパイラは使用するファイルの選択が必要ですがXcodeを使っている場合、全て自動的にチェックされるので何もしなくて大丈夫です。じゃあ、いいや!というわけではないのですが.......とりあえず今回はIDEに頼ります。
因みに今まで<>で囲んでいたものを""に変えたのは自分で書いたコードだからです。

別ファイル間での変数の共有

まず、宣言と定義の違いを知る必要がありますが......説明下手なのでわからなければこちらを見てください。頑張って説明しますが。
宣言というのはコンパイラが型と変数名を覚えることです。
定義というのは実際に宣言をもとに変数や関数を作成することです。
ここで定義の問題があります。宣言は実際に変数や関数を作るわけではないので幾らでも行えますが、定義の場合実際に変数を作るので被ったりしたらエラーが出てしまいます。
プロトタイプ宣言を思い出してください。
これも名前の通り宣言なのです。

extern宣言

これを使えば、宣言だけ行い定義を行わないということが可能になります。

sum.c
int Public;

int sum(int min,int max)
{
    int num;
    num = (min + max) * (max - min + 1) / 2;
    return num;
}

このint Public;という場所で変数の定義を行っています。
そして宣言は

sum.h
extern int sum(int min,int max);
extern int Public;

この様にすればいいわけです。
これによりPublicはmain.cからも使える様になりました。
ですが、これは必要最小限に止めるべきです。
そもそも、ファイルを分けることはそれぞれの機能を独立させることです。
それをあちこち繋げたら本末転倒です。

ヘッダーファイルから重複を防ぐ

sum.h
#ifndef includesum
#define includesum

int sum(int min,int max);

#endif

このプログラムを読み解いていきましょう。
#ifndef includesum
というコードが最初に出てきます。
これはincludesumが定義されていない場合のみ以後のコードをコンパイルする、という意味です。つまり次でincludesumが定義されているのでこのプログラムは一回目だけコンパイルされる、つまり実行されるということです。これなら重複は起きませんよね。
一番安全なのはこのコードです。

sum.h
#ifndef includesum
#define includesum

/* min~max間の合計値を計算する関数
int min 最小値
int max 最大値
戻り値 int 合計値
*/
extern int sum(int min,int max);

#endif

externとifndefを組み合わせていてコメントも詳しく書いている。
いいコードです。

学習編終了、お疲れ様でした

はい、ここまで読んでいただきありがとうございます。
これで苦しんで覚えるC言語の全ての過程を終了しました。
長かった様な短かった様な........次回からは遂にOS制作に着手します。
やった.....タイトル回収できる(嬉しい)!!!

Special Thanks

苦しんで覚えるC言語様
見てくださって、アドバイスをくださる皆様

本当にありがとうございます!

次回

次回:未定(近いうちに)

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.