【C言語】#ifdefと#if #defineの違いについてわかりやすく詳しく解説

プログラミングにおいて、条件分岐やコンパイル時の挙動を制御するために使用される#ifdef#if #defineというプリプロセッサディレクティブには、いくつかの違いがあります。

この記事では、それぞれの違いについて詳しく解説します。

目次から探す

#ifdefと#if #defineの違い

プログラミングにおいて、条件分岐やコンパイル時の挙動を制御するために、#ifdef#if #defineという2つのプリプロセッサディレクティブがあります。

この記事では、これらのディレクティブの違いについて詳しく説明します。

比較ポイント1: 条件式の書き方の違い

まず、#ifdef#if #defineの違いの一つは、条件式の書き方です。

#ifdefは、指定したマクロが定義されているかどうかをチェックします。

具体的には、#ifdef マクロ名という形式で使用します。

もし、指定したマクロが定義されていれば、その部分のコードがコンパイルされます。

一方、#if #defineは、指定したマクロの値によって条件分岐を行います。

具体的には、#if マクロ名 値という形式で使用します。

もし、指定したマクロの値が条件を満たしていれば、その部分のコードがコンパイルされます。

以下に、具体的なコード例を示します。


#include <stdio.h>
#define DEBUG
#ifdef DEBUG
    printf("DEBUGモードです。\n");
#endif
#define VERSION 2
#if VERSION >= 3
    printf("最新バージョンです。\n");
#else
    printf("古いバージョンです。\n");
#endif

上記のコードでは、DEBUGというマクロが定義されているため、#ifdef DEBUGの部分のコードがコンパイルされます。

また、VERSIONの値が2であるため、#if VERSION >= 3の部分のコードはコンパイルされません。

比較ポイント2: 定義の有無の確認方法の違い

次に、#ifdef#if #defineの違いのもう一つは、定義の有無を確認する方法です。

#ifdefは、指定したマクロが定義されているかどうかをチェックします。

もし、指定したマクロが定義されていれば、その部分のコードがコンパイルされます。

一方、#if #defineは、指定したマクロの値によって条件分岐を行います。

もし、指定したマクロが定義されていれば、その部分のコードがコンパイルされます。

以下に、具体的なコード例を示します。


#include <stdio.h>
#define DEBUG
#ifdef DEBUG
    printf("DEBUGモードです。\n");
#endif
#define VERSION 2
#if VERSION >= 3
    printf("最新バージョンです。\n");
#else
    printf("古いバージョンです。\n");
#endif

上記のコードでは、DEBUGというマクロが定義されているため、#ifdef DEBUGの部分のコードがコンパイルされます。

また、VERSIONの値が2であるため、#if VERSION >= 3の部分のコードはコンパイルされません。

比較ポイント3: 複数の条件の組み合わせの違い

さらに、#ifdef#if #defineの違いの一つは、複数の条件の組み合わせの方法です。

#ifdefは、単一のマクロの定義の有無をチェックするために使用されます。

複数の条件を組み合わせることはできません。

一方、#if #defineは、複数の条件を組み合わせることができます。

具体的には、#ifディレクティブの後に論理演算子(&&||)を使用して条件を組み合わせます。

以下に、具体的なコード例を示します。


#include <stdio.h>
#define DEBUG
#define VERSION 2
#if defined(DEBUG) && VERSION >= 3
    printf("DEBUGモードかつ最新バージョンです。\n");
#elif defined(DEBUG) || VERSION >= 3
    printf("DEBUGモードまたは最新バージョンです。\n");
#else
    printf("通常モードかつ古いバージョンです。\n");
#endif

上記のコードでは、DEBUGというマクロが定義されているため、#if defined(DEBUG)“の部分のコードがコンパイルされます。

また、VERSIONの値が2であるため、#if VERSION >= 3の部分のコードはコンパイルされません。

#ifdefと#if #defineの違いのまとめ

  • #ifdefは、指定したマクロが定義されているかどうかをチェックするために使用されます。
  • #if #defineは、指定したマクロの値によって条件分岐を行うために使用されます。
  • #ifdefは、単一のマクロの定義の有無をチェックすることができますが、複数の条件の組み合わせはできません。
  • #if #defineは、複数の条件を組み合わせることができます。

適切な使い方のポイント

  • #ifdefは、特定のマクロが定義されているかどうかをチェックするために使用します。

例えば、デバッグモードの有無やプラットフォームの違いによるコードの分岐などに使用されます。

  • #if #defineは、マクロの値によって条件分岐を行うために使用します。

例えば、バージョンの比較や特定の条件を満たすかどうかの判定などに使用されます。

適切な使い方をすることで、プログラムの柔軟性や可読性を向上させることができます。

ただし、過剰な使用はコードの複雑さを増す原因となるため、必要最低限の使用に留めることが重要です。

目次から探す