C言語でifdefを活用する7つのステップ

C言語とifdefを理解し、活用するための7つのステップを解説するイラストC言語
この記事は約6分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

皆さんはプログラミングを行う上で、条件によってコードを動かす、または動かさないという状況に遭遇したことがありますか?

それを実現するためにC言語では、”ifdef”というプリプロセッサディレクティブが用意されています。

この記事ではC言語でifdefを活用する方法を7つのステップで解説します。

初心者でも理解できるように詳細なサンプルコードと応用例を交えながらご紹介します。

●C言語とは

C言語は、高性能で広く利用されているプログラミング言語の一つで、システムソフトウェアからアプリケーションソフトウェアまで幅広い領域で使われています。

また、そのシンタックスは他の多くのプログラミング言語の基礎となっており、学習することで他の言語を理解する手助けにもなります。

●ifdefとは

○基本構文

C言語のifdefは、プリプロセッサディレクティブと呼ばれるもので、プログラムがコンパイルされる前の段階で処理が行われます。

基本構文は次の通りです。

#ifdef マクロ名
// マクロ名が定義されている場合に実行されるコード
#else
// マクロ名が定義されていない場合に実行されるコード
#endif

このコードでは、ifdefというディレクティブを使ってマクロ名が定義されているかどうかを判断し、定義されている場合とそうでない場合で異なるコードを実行します。

●ifdefの使い方

○サンプルコード1:ifdefの基本的な使い

ifdefの基本的な使い方について紹介します。

#define TEST

#ifdef TEST
printf("TEST is defined.\n");
#else
printf("TEST is not defined.\n");
#endif

この例では、まず最初にマクロTESTを定義しています。

その次のifdef文で、TESTが定義されているかどうかを判断しています。

もしTESTが定義されている場合は”TEST is defined.”と表示され、定義されていない場合は”TEST is not defined.”と表示されます。

ここでの結果は”TEST is defined.”が出力されます。

○サンプルコード2:ifdefを使ったデバッグ情報の表示制御

次に、ifdefを用いてデバッグ情報の表示を制御する例を紹介します。

#define DEBUG

#ifdef DEBUG
printf("Debug: x=%d, y=%d\n", x, y);
#endif

この例では、マクロDEBUGが定義されている場合のみ、デバッグ情報が表示されます。

このようにして、デバッグ時には詳細な情報を表示し、リリース版では表示しない、といった制御が可能になります。

DEBUGマクロが定義されているときのみ”Debug: x=値, y=値”と出力され、定義されていない場合は何も出力されません。

●ifdefの応用例

○サンプルコード3:ifdefを使ったマルチプラットフォーム対応

ifdefは、マルチプラットフォーム対応の一環としても活用できます。

次のコードはその一例です。

#ifdef WINDOWS
printf("This is Windows.\n");
#elif defined(LINUX)
printf("This is Linux.\n");
#else
printf("This is other OS.\n");
#endif

この例では、プラットフォームがWindowsの場合とLinuxの場合とそれ以外の場合で異なるメッセージを出力します。

各プラットフォームごとに異なるマクロを定義し、そのマクロによって処理を分岐させています。

Windowsでコンパイルした場合は”This is Windows.”が、Linuxでコンパイルした場合は”This is Linux.”が出力され、それ以外の場合は”This is other OS.”が出力されます。

○サンプルコード4:ifdefを使った特定のコードの無効化

ifdefは、特定のコードを一時的に無効化するためにも使えます。

例えば、次のようなコードが考えられます。

#ifdef SKIP_THIS_PART
// ここは一時的にスキップしたいコード
printf("This part is skipped.\n");
#endif

この例では、マクロSKIP_THIS_PARTが定義されている場合のみ、特定のコードが実行されます。

つまり、このマクロを定義しないことによって特定のコードを一時的にスキップすることができます。

SKIP_THIS_PARTマクロが定義されている場合は”This part is skipped.”が出力され、定義されていない場合は何も出力されません。

●注意点と対処法

一方で、ifdefを使用する際には注意点も存在します。

その一つが、ifdefの中にあるコードはコンパイラによる型チェックや構文チェックを受けないという点です。

これは、そのコードがコンパイル時に無視されるためです。

そのため、間違った型や構文を含むコードを記述してしまうと、その部分が実行されたときに初めてエラーが検出されます。

この問題を回避するためには、それぞれの条件で正しくコンパイルできることを確認するようにしましょう。

●カスタマイズ方法

○サンプルコード5:ifdefとifndefの組み合わせ

次に、ifdefとifndefを組み合わせて使う例を紹介します。

#ifndef TEST
#define TEST
#endif

#ifdef TEST
printf("TEST is defined.\n");
#else
printf("TEST is not defined.\n");
#endif

この例では、最初にifndefを用いて、もしTESTが定義されていなければ定義する、という処理をしています。その後、ifdefを用いてTESTが定義されているかどうかを確認しています。

このようにして、マクロが定義されていない場合にだけ定義を行い、既に定義されている場合はそのままにする、といった制御を実現できます。

ここでは”TEST is defined.”が出力されます。

○サンプルコード6:複数のマクロを制御するifdefの利用

複数のマクロを制御するためにifdefを利用することもできます。

#define TEST1
#define TEST2

#if defined(TEST1) && defined(TEST2)
printf("Both TEST1 and TEST2 are defined.\n");
#elif defined(TEST1)
printf("Only TEST1 is defined.\n");
#elif defined(TEST2)
printf("Only TEST2 is defined.\n");
#else
printf("Neither TEST1 nor TEST2 is defined.\n");
#endif

この例では、マクロTEST1とTEST2がともに定義されているか、どちらか一方だけが定義されているか、どちらも定義されていないかによって異なるメッセージを出力します。

ここでは”Both TEST1 and TEST2 are defined.”が出力されます。

まとめ

以上、C言語でifdefを活用する方法を7つのステップで解説しました。

ifdefは非常に便利な機能ですが、その使用には注意が必要であるということも覚えておきましょう。

また、用途に応じてifndefや#if definedを組み合わせて利用することで、より柔軟なコード制御が可能になります。

これらの知識を活かして、ぜひC言語のコーディングを楽しんでください。