cd c
を実行した後で( ~/c
に移動した後で )、以下の課題を
やってみよ。
マクロ sq(x) について、本文に示した誤った例2つについて実際に cppを用いて、展開結果が間違っていることを確認しなさい。
プログラムの開発過程ではバグを出す作業をデバッグと呼んでいる。
デバッグの手法にはいろいろなものが考えられているが、最も
原始的でありながら古来より使われている手法に、printf攻撃
と呼ばれるものがある。これは、怪しいとにらんだ主要な変数や
関数の呼び出しなどを、しつこく printf 文を使って表示する
ものである。これが本文で紹介した以下のような使い方で、
当然、大量に導入した printf 文をデバッグが終った後に、
わざわざ削除するのも面倒なので、ifdef-endif
を
用いて処理している訳である。
#ifdef DEBUG printf("debug: gakusei->point is %d\n",gakusei->point); #endif
さて、そうは言ってもいちいち上記のように #ifdef
と
#endif
で囲むのも面倒であるので、これをマクロに置き換え
ることを考えよう。このマクロを Debug()
とし、
プログラム先頭に #define DEBUG
があれば、上の ifdef と
同じように働く printf が呼ばれ、なければ何も起こらないような
マクロを考えなさい(勿論、この場合引数は2個のみの場合であるが)。
Debug("gakusei->point is %d\n",gakusei->point);
ファイルのオープンに際して、
(fp=fopen(file_name,"r"))==NULLは定型 文であるので、これをマクロにして、
read_fopen()
というマクロを
作る事を考えよう。このマクロは以下のように使う事を想定している。
FILE *fp; char *file_name="myfile.h"; ... if( read_fopen(fp, file_name ) ){ /* ファイルのオープンに失敗した場合 */ printf("Error: cannot open %s\n", file_name); exit(1); } ... |
こうなるようなマクロ定義を作成し、展開結果を確かめよ。
同様に、write_fopen()
や append_open()
を
作成せよ。
作成したプログラムをメイルで creport まで送りなさい。題は、kadai25 とする事。