C言語

不変の値の扱い(#define)

これまで、プログラム中に直接記述してきた数値のことを、定数と呼びます。直接書き込まれている文字列(文字列リテラル)も定数です。
プログラム中に、何度も同じ数値や文字列を使うことがでてくることがあると思いますが、もし、定数を記述していると、この定数値を修正したいと思ったときに、複数の箇所を修正しないといけなくなります。

そこで、あらかじめ数値や文字列に名前をつけてたものを定義しておいて、その付けた名前を使うようにすれば、今後修正が必要になっても、定義しておいた箇所のみ値を変更だけで済むという利点があります。

定数に名前を付ける

C言語では、#define(デファイン)を使って定数に名前を付けることができます。定数に付けた名前のことをマクロといいます。
#defineを使用したマクロの定義は次のようになります。

マクロの定義

#define マクロ名 定数

マクロ名には、変数名と同様に識別子を使用することができます。ただし、変数名とマクロ名の区別がわかりにくいため、大文字を使うことが一般的です。
定数には、数値や文字列を記述します。
また、文の終わりに、セミコロン( ; )は付けません。

次にマクロ定義したサンプルプログラムを示します。

#include <stdio.h>

#define MAX 3

int main(void)
{
    int number[MAX] = { 10, 20, 30 };
    int i;
    
    for( i = 0; i < MAX; i++ )
    {
        printf("%d\n", number[i]);
    }
    return 0;
}

配列の変数宣言にて、要素数に変数を使用できないことを学びましたが、マクロ名は使用することが可能です。

サンプルプログラムを実行した結果は次のようになります。

実行結果

10
20
30

要素数や、for文の条件式にMAXという名前を使用していますが、こちらは、#defineで定義した値の3に置き換えられて実行されていることがわかると思います。

このMAXの値を次のように変更します。

#define MAX 5

変更したサンプルプログラムを実行すると、次のようになります。

実行結果

10
20
30
0
0

MAXの値が3から5に定義した値を変更したことにより、MAXを使用している箇所も3から5に置き換えられて実行された結果、number配列の要素が5になり、for文の条件式も i < 5 となったことで、5回繰り返しが行われるように変更されました。
このように、定数をマクロに置き換えると、#defineで定義した箇所の変更のみで、マクロを使用している箇所すべての値も置き換わるので、修正が容易になります。

マクロの定義の際、数値を指定していましたが、文字列でも使用できますので、こちらについても学んでいきます。

文字列の定数に名前を付ける

#defineは、数値以外に、文字列に対しても名前を付けることができます。
文字列に名前を付けたサンプルプログラムを次に示します。

#include <stdio.h>

#define DISP "Hello World"

int main(void)
{
    printf( "%s", DISP );
    return 0;
}

サンプルプログラムを実行した結果は次のようになります。

実行結果

Hello World

数値と同様に文字列に対しても名前を付けられます。文字列は、今まで通り、" "で囲む必要があります。

以上が、 #define(デファイン)を使用したマクロの定義についてでした。

次は、異なる種類の変数をまとめることができる構造体の使い方について学びます。

異なる種類の変数をまとめることができる構造体の使い方

-C言語