【C言語】defineマクロを空定義する使い方についてわかりやすく解説

C言語において、defineマクロを使うことで、プログラム内で定数や関数のようなものを定義することができます。
しかし、そのマクロを空定義することも可能です。
この記事では、マクロの殻定義する理由や使い方についてわかりやすく解説します。
空定義の使い方
C言語には、#define
マクロを用いて定数や関数のようなものを定義することができます。その中でも、空定義というものがあります。空定義とは、何も処理や値を記述せずにマクロを定義することです。
#define EMPTY_MACRO
このように、何も処理を行わないマクロを定義することで、以下のような使い方ができます。
デバッグ時の出力制御
デバッグ時には、プログラム内部の状態を確認するために出力文を挿入することがあります。しかし、リリース時には不要な出力文が残ってしまう可能性があるため、コンパイル時に条件分岐して出力文を削除する必要があります。
この場合、以下のような空定義マクロを用いることで簡単に実現できます。
#ifdef DEBUG_MODE
#define DEBUG_PRINT(...) printf(__VA_ARGS__)
#else
#define DEBUG_PRINT(...)
#endif
上記の例では、DEBUG_MODE
が定義されている場合はprintf()
関数で引数を出力するDEBUG_PRINT
マクロが定義されます。
一方でDEBUG_MODE
が未定義の場合は何も処理しないDEBUG_PRINT
マクロが定義されます。
コンパイル時の条件分岐
C言語では条件分岐文(if文)や三項演算子(?:演算子)などを用いてプログラム内部で条件分岐させることができます。しかし、コンパイル時における条件分岐も可能です。
以下はコンパイル時における条件分岐例です。
#if defined(_WIN32)
#include <windows.h>
#elif defined(__linux__)
#include <unistd.h>
#endif
上記例では、Windows環境かLinux環境かでインクルードファイルを変更しています。このような場合でも空定義マクロは有効活用されています。
空定義の注意点
空定義を使う際には、以下の注意点に気をつける必要があります。
マクロ名の重複に注意
空定義を行うマクロ名は、既存のマクロ名と重複しないようにする必要があります。
もし同じマクロ名で空定義を行ってしまうと、既存のマクロが無効化されてしまい、プログラム全体に影響が出る可能性があります。
例えば、以下のようなコードでは、DEBUG
というマクロが既に定義されています。
#define DEBUG 1
int main() {
#ifdef DEBUG
printf("Debug mode\n");
#endif
return 0;
}
この場状態でDEBUG
というマクロ名で再定義してしまうと、本来なら1が返されるはずのDEBUGが100を返してしまうことになります。
#include<stdio.h>
#define DEBUG 1
int main() {
#define DEBUG 100
#ifdef DEBUG
printf("Debug mode(%d)\n",DEBUG); //DEBUGは1ではなく100になる
#endif
return 0;
}
よくあるのが別々のヘッダーファイルで同じマクロ名を定義してしまうケースです。
マクロはインクルードしたヘッダーファイルのマクロが全て有効になるため、同じマクロ名があると正常に動作しなくなるので注意しましょう。
終わりに
以上が、C言語でdefineマクロを空定義する使い方についての解説でした。
空定義は、デバッグ時の出力制御やコンパイル時の条件分岐など、様々な場面で活用されます。
ただし、マクロ名の重複に注意したり、マクロの定義位置にも注意する必要があるので注意して使うようにしましょう。