next up previous contents
Next: 16. 配列 I Up: 15. 記憶クラスとモジュール Previous: 6. 記憶クラスの有効範囲と寿命のまとめ

3. 課題 15

cd c を実行した後で( ~/c に移動した後で )、以下の課題を やってみよ。

課題 15.1
モジュールと分割コンパイル I

以下のプログラムを各々別のファイルとして作成し、分割コンパイル を行い、最終的に一つの実行ファイルを作成せよ。


/* header file : head.h */
    float  test1(float x, float y);
    char * test2( char * s);


/* file : kadai15_1_1.c */
#include <stdio.h>
#include "head.h"
main(){
    printf("test1 %f\n", test1(3.0, 4.0) );
    printf("test2 %c\n", test2("string"));
}


/* file : kadai15_1_2.c */
#include <stdio.h>
#include "head.h"
float test1(float x, float y){
	return x*x*y*y;
}
char *test2(char *s){
	return s+1;
}

課題 15.2
モジュールと分割コンパイル II

課題13.2 を2つのモジュールに分割し、*create() の関数と それ以外の部分に分けよ。但し、外部変数については、main()関数の 側のモジュールに宣言し、もう一方のモジュール内では extern 宣言 せよ。同時に、関数宣言は全て一つのヘッダーファイルに移し、 分割コンパイルを行い、動作を確認せよ。

ヘッダーファイルと、*create() を含む方のモジュールを 一つのメイルにいれて creport まで送りなさい。但し、ファイル名 は分かるようにしなさい。(つまり、main() 関数を含む方のモジュール は送らなくても良い)

題はkadai15とすること。

前回の復習
プリプロセッサ

Cのコンパイラは、コンパイル作業の前に一連の作業を行う。これはプリプロセッサ と呼ばれているが、プリプロセッサに命令するためのコマンドの一つが #include 命令である。この命令の意味は、指定したファイルをその場所に 取り込む事である。従って、モジュール間で共有したいファイルなどを取り込むた めに使われ、標準ライブラリなどの部品の関数宣言やその他の定義もこれを用いて ソースに埋めこまれるようになっている。

<>でファイル名を括った場合には標準のパスからしか読み込まない が、


    #include <stdio.h>
"" で括った場合には、カレントディレクトリを探してから標準パスを 探すようになっているので、自作のファイルを取り込む際にはこちらを使う。

    #include "mylist.h"

こうした取り込まれるファイルはヘッダーファイルと呼ばれ、拡張子に .h を用いるのが慣例となっている。

記憶クラス

変数の有効範囲や、寿命は変数の記憶クラスによって決まる。 記憶クラスと寿命の関連を再掲すると以下のようになっている。

変数 宣言場所 記憶クラス指定子 有効範囲 寿命
レジスター変数 関数(ブロック)内部 register 関数(ブロック)内部 消滅
自動変数 関数(ブロック)内部 auto 関数(ブロック)内部 消滅
静的変数 関数(ブロック)内部 static 関数(ブロック)内部 永続
外部変数の引用 関数内部 extern 関数内部 永続
外部変数の引用 関数外部 extern モジュール内部 永続
外部変数 関数外部 無し モジュール全域 永続
静的外部変数 関数外部 static モジュール内部 永続


next up previous contents
Next: 16. 配列 I Up: 15. 記憶クラスとモジュール Previous: 6. 記憶クラスの有効範囲と寿命のまとめ
Noriyo Kanayama