c

Method of file division

ファイル分割

c言語のファイル分割では関数等を書き込むファイル.c``.hファイルとmain関数を書き込むファイルの3つのファイルを用意する

  1. 関数を書き込むcalc.cファイル

    #ifndef _CALC_H_
    #define _CALC_H_
    
    //  関数avgのプロトタイプ宣言
    double avg(double,double);
    
    #endif // _CALC_H_
    
  2. calc.hファイル

    #include "calc.h"
    
    //  平均値を求める関数
    double avg(double l,double m){
        //  引数l,mの平均値を求め、rに代入する。
        double r = (l + m) / 2.0;
        return r;
    }
    

    このファイルでは次のようにファイルに書き込み、プロトタイプ宣言を行う

    #ifnfdef _(大文字で記述したファイル名)_H_
    #define _(大文字で記述したファイル名)_H_
    
    プロトタイプ宣言;
    プロトタイプ宣言;
    
    
    
    #endif // _(大文字で記述したファイル名)_H_
    

    ここで登場した#ifndef``#define``#endifはマクロといい、二重インクルードを防いでいる

  3. main関数を書き込むmain.cファイル

    #include <stdio.h>
    #include "calc.h"
    
    void main(){
    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);
    }
    

コンパイルの仕方

gcc はコマンドラインで与えられたソースファイルしか読み込まないため、すべての.cソースファイルをまとめ上げて実行する必要がある

下記2パターンの方法で実行が可能

  1. (即席回答)1コマンドで

    $ gcc main.c calc.c
    

    ※-o オプションで実行ファイル名を指定することも可能

    この方法ではオブジェクトファイル*.oは最後に掃除・削除されるため残らない

  2. 3コマンドで

    $ gcc -c main.c
    $ gcc -c calc.c
    $ gcc main.o calc.o
    

    -c オプションではオブジェクトファイル*.oを作るところまでしてくれる

    この方法では途中までの.oファイルも残るため、途中でコンパイルエラーが起きてもそれまでのオブジェクトファイルは残るという利点がある。したがってたくさんの*.cファイルで構成される実務プログラムではこの方法で1本ずつコンパイルシていくのが一般的担っている。

c言語コンパイルのちょこっと解説

gcc は、3つの下請けを順次起動する、親玉に過ぎません。

  1. プリプロセッサ - #include や #define を処理、本来(?)のC言語ソースにする
  2. コンパイラ - *.c をコンパイルし、オブジェクトファイル *.o を作る
  3. リンカ - 1個以上の *.o をまとめあげ、1個の実行形式ファイル(Windowsなら *.exe)を作る

gcc の -c オプションは、「上記2.まででいいよ」指示です。

即席回答 1. のやりかたは、これを全部まとめて1回にしてるだけ。

*.o は、実は途中でできてますが、こういう要求のしかたをされたgcc は、最後にキレイに掃除・削除してしまいます。

参考