next up previous contents
Next: 23. ファイル入出力 Up: 22. 記憶クラスとモジュール Previous: 6. 記憶クラスの有効範囲と寿命のまとめ

3. 課題 22

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

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

課題21.4 を2つのモジュールに分割し、一つはリストの扱いに関するモジュール と一つは学生データの扱いに関するモジュールにせよ。 分割コンパイルを行い、動作を確認せよ。

課題 22.2
静的外部変数

課題22.1 を改良し、リンクの始点ポインタ start を静的外部変数にせよ。 他のモジュールからは参照不可能であることを確認するプログラムを追加 せよ。

課題 22.3
静的変数

課題22.2 のリンクに関するモジュールに、リンクされたオブジェクトの 個数を保持するように修正せよ。更に、オブジェクトの数を返す関数を 追加せよ。

作成したプログラムをメイルで creport まで送りなさい。題は、kadai22 とする事。 但し、作成したモジュールがそれぞれ分かるようにして送りなさい。

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

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

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


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

    #include "mylist.h"

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

記憶クラス

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

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



Noriyo Kanayama 平成14年11月26日