C言語入門 第10回 プリプロセッサ機能(マクロ、インクルード)の使い方




2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を強力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。



1.マクロ

 マクロは、コンパイラやインタープリタがC言語のプログラムを実行(翻訳)する前に、ある文字列から他の文字列への置換えを行う機能です。 まず、次のようにして置き換える文字列を定義します。

#define TEN 10

 この定義は、TENという文字列(文字列定数のことではありません)を10に置き換えます。 置換えは、この定義の次の行から開始されてTENという文字列が見つかるとそれを10に置き換えていきます。 たとえば、i = TEN;という行はi = 10;に置換えられて実行されます。 マクロの利用目的は多数ありますが、代表的なものには次のような場合があります。

 @定数に意味をもたせる。
 変数の付け方で、変数名に意味をもたせると説明しましたが、このことは定数にも当てはまります。

main()
{

        int i;

        scanf("%d", &i);
        printf("%d", i*112);
}
20
2240
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて...

 入力した数値に112をかけて、その結果を表示するだけのプログラムですが、これでは112という数字(定数)の意味がはっきりとしません。 このような場合にマクロ機能を使用して112に意味を付け、プログラムをわかりやすくします。

#define YEN_RATE 112

main()
{
        int i;

        scanf("%d", &i);
        printf("%d", i*YEN_RATE);
}
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて...

こうすれば、このプログラムは入力した米ドルを日本円に変換するプログラムであるということが理解しやすくなります。

参考)
 マクロの説明で使った#define TEN 10といった使い方は、定数の意味がまったくわかりません。 このような使い方をするくらいなら、数字のまま10と書いたほうが良いでしょう。 また、マクロ定義用の名前はYEN_RATEのように大文字で書くのが普通です。

 A同じ値が何カ所でも使われている場合、マクロを使ってまとめます。配列の説明で使った、次のプログラムを見てください。

int     print_bar(int);

main()
{
        int n;
        int data[5];

        for (n = 0; n < 5; n++) {
                printf("input data %d: ", n);
                scanf("%d", &data[n]);
        }
        for (n = 0; n < 5; n++) {
                print_bar(data[n]);
        }
}

print_bar(n)
int n;
{
        int i;

        for (i = 0; i < n; i++) {
                printf("*");
        }
        printf("\n");
}
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて...

 このプログラムは5個のデータを入力して5本の棒グラフを表示するものです。この5という数字がプログラムの中で3回使われています。 このプログラムを10個のデータまで扱えるように変更するには、3箇所の定数5を10にしなければなりません。 しかし、取り扱えることのできるデータ数をマクロで定義しておけば、1箇所の修正ですみます。

#define MAX_DATA 10

int     print_bar(int);

main()

{
        int n;
        int data[MAX_DATA];

        for (n = 0; n < MAX_DATA; n++) {
                printf("input data %d: ", n);
                scanf("%d", &data[n]);
        }
        for (n = 0; n < MAX_DATA; n++) {
                print_bar(data[n]);
        }
}

print_bar(n)
int n;
{
        int i;
        for (i = 0; i < n; i++) {
                printf("*");
        }
        printf("\n");
}
input data 0: 10
input data 1: 35
input data 2: 65
input data 3: 42
input data 4: 16
input data 5: 56
input data 6: 42
input data 7: 9
input data 8: 60
input data 9: 2
**********
***********************************
*****************************************************************
******************************************
****************
********************************************************
******************************************
*********
************************************************************
**
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて...

このプログラムの1行目だけを変更するだけで、取り扱えるデータ数を変化させることができます。 この例のように3カ所程度ならマクロを使わなくてもなんとかなるでしょうが、プログラムが大きくなると変更のための作業量が多くなり、プログラムミスの原因にもなります。 日頃からマクロを使う習慣をつけておくようにしましょう。

 マクロにはもっと多くの機能と利用方法がありますが、最初のうちはこの程度の利用方法だけでも十分だと思います。


2.インクルード

 インクルードもマクロと同様にコンパイラやインタープリタが実行(翻訳)する前段階で処理される機能です。 インクルード機能を使うと、プログラムのある部分に他のファイルの内容を取り込み、その後プログラムは実行されます。 取り込まれるファイルのことをインクルードファイルと呼び、取込み側のCプログラムと区別するために、通常、ファイル名の拡張子には.hを使用します。 インクルードファイルの内容はCプログラムの一部であれば何でも構いませんが、普通はdefine(マクロ)や各種の定義をまとめておきます。 インクルード機能を積極的に使用するのは、作成するプログラムが大きくなってからでよいと思います。 しかし、Cコンパイラやインタープリタはあらかじめいくつかのインクルードファイルを用意しており、ある種の関数を使用する場合にはインクルードしなければならないものがあります。 Study Cがあらかじめ用意しているインクルードファイルには次のものがあります。

stdio.h
fcntl.h
time.h
stdlib.h
ctype.h
dirent.h
limits.h
float.h
math.h
string.h
graph.h

 コンパイラ型のC言語では、多くのインクルードファイルを用意していますが、Study Cでは、インタープリタの特性を活かしてできるだけ内部にインクルードファイルの情報を格納してあります。 インクルードは次の形式で行います。

#include <インクルード>

 たとえば、Study Cが用意しているインクルードファイルをインクルードするには次のようにします。

#include <stdio.h>
#include <fcntl.h>
#include <time.h>
#include <stdlib.h>
#include <dirent.h>

 今の段階では、コンパイラやインタープリタが用意しているインクルードファイルの内容について理解する必要はありません。


3.インクルードファイルの作り方

 大きなプログラムを作成するようになるまでは、インクルードファイルを作る必要はありませんが、将来のためにインクルードファイルの作り方について簡単に説明します。 まず、エディタを使って次に示すインクルードファイルの内容を入力していきます。

#define MAX_DATA 10

 この1行を入力してF12でコマンド・モードに戻り、saveコマンドでインクルードファイルを作成します。

save def.h

正しくセーブが行われたらnewコマンドでバッファから消去します(読み込んでいない状態にします)。

new

 次に、このインクルードファイルを利用するプログラムを入力します。

#include "def.h"

main()
{
        int i;
        int data[MAX_DATA];
        int sum;

        for (i = 0; i < MAX_DATA; i++) {
                printf("input data %d: ", i);
                scanf("%d", &data[i]);
        }
        sum = 0;
        for (i = 0; i < MAX_DATA; i++) {
                sum += data[i];
        }
        printf("\nSUM = %d\n", sum);
}
input data 0: 10
input data 1: 15
input data 2: 20
input data 3: 25
input data 4: 30
input data 5: 35
input data 6: 40
input data 7: 45
input data 8: 50
input data 9: 55

SUM = 325
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて...

このプログラムの1行目でインクルードを行っています。自分で作ったインクルードファイルはこの例のように"..."で囲んでインクルードさせます。

#include  "インクルードファイル"

[an error occurred while processing this directive]