マクロ
マクロ
C言語におけるマクロとは#から始まる1行のことで、#includeもマクロの一つです。
マクロで書かれた内容はプリプロセッサと呼ばれる処理で使用されます。
#if、#ifndef、#ifdef
#if、#ifndef、#ifdefは条件を設定し、最後を#endifで閉じることで
#if~#endifの範囲のコンパイルを行うかどうかを決めることができます。
条件を満たした場合はコンパイル対象となり、
満たさなかった場合はコンパイル対象から外されます。
以下に各マクロの書式と具体例を記述します。
#if
書式例:
#if 条件
条件を満たしていたらコンパイル
#endif
具体例:
#define DEBUG_PROC (1)
#if DEBUG_PROC == 1
// DEBUG_PROCの値が1ならコンパイル
#endif
※#ifの条件は整数かdefineで設定した値が使用できます。
#ifndef
書式例:
#ifndef 識別子
識別子が定義されていなかったらコンパイル
#endif
具体例:
#ifndef _DEBUG_
// _DEBUG_識別子が定義されていないならコンパイル
#endif
#ifdef
書式例:
#ifdef 識別子
識別子が定義されていたらコンパイル
#endif
具体例:
#define DEBUG
#ifdef DEBUG
// DEBUG識別子が定義されていたらコンパイル
#endif
用途
#ifndefはヘッダファイル使用時の多重定義を防ぐために使用されています。
#if、#ifdefはテストやデバッグの処理を本番用の処理に
反映させないようにするために使用されています。
また、#ifは制御文のif文のように#elseif 条件、#elseなどを使用することで
条件分岐を行うことができます。
#define
#defineは識別子と呼ばれる文字列を宣言するマクロです。
識別子の後ろに値や文字列を指定するとプリプロセッサにて
識別子の部分がそれらの内容に置換されます。
以下は#defineの書式と具体例、使用例になります。
書式例:
#define 識別子 定義本体
具体例:
#define MYNAME "山田 太郎"
使用例:
#include <stdio.h>
#define MYNAME "山田 太郎"
int main(void)
{
printf("%s", MYNAME);
return 0;
}
出力結果:
山田 太郎
このようにdefineで宣言した識別子を使用すると定義本体の内容に置換されて実行されます。
書式からもわかると思いますが、#defineには「;」を使用しませんので気をつけてください。
また、defineは通常の変数と区別するために識別子の名前は全て大文字を使用します。
defineの様々な宣言
識別子定義のみ
定義本体を記述しなくても識別子を書くだけで
その識別子を定義したことになります。
書式例:
#define 識別子
具体例:
#define _DEFINE_
引数つき
識別子に引数を設定することができます。
その引数を使用して関数のような挙動を行うことが可能です。
書式例:
#define 識別子(引数) 定義本体
具体例:
ADDSUM(x, y) (x + y)
使用例:
#define ADDSUM(x, y) ((x) + (y))
int main(void)
{
printf("%d\n", ADDSUM(1, 2));
return 0;
}
出力結果:
3
xとyを()で囲っているのは、引数の内容がそのまま置換されてしまうからです。
()の有無で以下のような違いが出ますので気をつけてください。