第29章 マクロの活用法

 前回話したマクロ。今回はその使い時というものをいろいろ紹介していきたいと思います。便利なのでみなさん十分活用して下さい。


 以下が今回の要点です。


 では、いってみましょう。


 今までは数値をそのまま書いてきました。例えば次のプログラムがそうです。

プログラム
// Macro2a.cpp
#include <iostream.h>

int main()
{
    int i;
    int nFibo[16] = { 1, 1 };

    for(i = 0; i < 16 - 2; i++)
        nFibo[i + 2] = nFibo[i] + nFibo[i + 1];

    cout << "フィボナッチ数列の最初の 16 桁は、" << endl;
    for(i = 0; i < 16 - 1; i++)
        cout << nFibo[i] << ", ";

    cout << nFibo[i] << " です。" << endl;

    return 0;
}
実行結果
フィボナッチ数列の最初の 16 桁は、
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987 です。

 16 というのが4箇所も出てきていますね。このプログラムの欠点は、16 でなくて 100 にしたいなどというときに4箇所も変更を加えなくてはならないというところです。これはまだ近いところに固まっているのでまだましですが、大きなプログラムになると変更漏れが出てくるおそれが非常にあります。

 こんなときにマクロが役に立ちます。では、上のプログラムを変更したものを見て下さい。

プログラム
// Macro2b.cpp
#include <iostream.h>

#define NUMBER_FIBO     16

int main()
{
    int i;
    int nFibo[NUMBER_FIBO] = { 1, 1 };

    for(i = 0; i < NUMBER_FIBO - 2; i++)
        nFibo[i + 2] = nFibo[i] + nFibo[i + 1];

    cout << "フィボナッチ数列の最初の " << NUMBER_FIBO << " 桁は、" << endl;
    for(i = 0; i < NUMBER_FIBO - 1; i++)
        cout << nFibo[i] << ", ";

    cout << nFibo[i] << " です。" << endl;

    return 0;
}

 16 の部分が全て NUMBER_FIBO になりました。そして、それを 16 に置き換えるようにしています。ただ、マクロは文字列の中では置き換わらないので、文字列の部分だけは少し変更を加えています。

 このようにすれば、先ず数値の変更が楽になります。#define の部分の 16 を 100 に変えるだけでいいのです。

 そして、ただの数値でなく、意味を持った言葉に置き換えたので、読みやすいプログラムになりました


 ほかに、マクロは反復して使う処理を短い、わかりやすい形に書き換えるときに使います。

 「何だ、それじゃ関数と同じじゃないか」と思うかもしれません。ですが、両者には少し違いがあります。

 関数はその処理がどこか別のところにできて、使用する際は処理がそこに移ります。しかし、マクロはテキストの置き換えですから、そのようなことは起こりません。関数は処理が移る分、少しだけですが時間をロスしてしまうのです。

 そのかわり処理が大きくなると、マクロはそれを随所に埋め込むわけですから、実行ファイルのサイズが肥大してしまいます。大きな処理は関数に任せた方がいいでしょう。

 また、マクロにしかできない書き換えというのもあります。例えば、こんな感じでしょうか。

プログラム
// Macro2c.cpp
#include <iostream.h>

#define NUMBER_FIBO        16
#define LOOP(val, times)   for(val = 0; val < (times); val++)

int main()
{
    int i;
    int nFibo[NUMBER_FIBO] = { 1, 1 };

    LOOP(i, NUMBER_FIBO - 2)
        nFibo[i + 2] = nFibo[i] + nFibo[i + 1];

    cout << "フィボナッチ数列の最初の " << NUMBER_FIBO << " 桁は、" << endl;
    LOOP(i, NUMBER_FIBO - 1)
        cout << nFibo[i] << ", ";

    cout << nFibo[i] << " です。" << endl;

    return 0;
}

 for の部分を LOOP というマクロにしました。これと同じことは関数ではできません。

 このようにマクロには、短い処理に名前を付けて扱いやすくするという使い方があるのです。


 マクロというのは便利なものですが、いろいろと問題点もあります。まぁそこは、マクロは変数や関数と違って、用意したテキストと置き換わって、そしてコンパイルされるものだということを常に意識していれば、あまり気になるものではありません。

 とはいえ、初めは注意すべき点をある程度心得ておく必要があるでしょう。ということで、次回はマクロの書式や注意点について話したいと思います。

 では、今回の要点です。


 また次回まで、さようなら。


第28章 マクロの手始め | 第30章 マクロの書式

Last update was done on 1999.3.17

この講座の著作権はロベールが保有しています