【独学C言語入門㉑】条件付きコンパイルについて学ぼう【#if/#ifdef/#endif】

今回は《条件付きコンパイルについて学ぼう》というテーマで記事をまとめます。

「条件付きコンパイル」を習得すると、コンパイル時にプログラムの無効化・プログラムの切り替えなどができるようになります。強力な機能の1つなのでしっかり学んでいきましょう!

尚、現在執筆中のC言語入門記事は以下の人を対象としています。

  • プログラミング未経験の人
  • C言語プログラミングの学習をこれから始めたい人
  • C言語プログラミングの学習を始めたばかりの人

条件付きコンパイルについて学ぼう

条件付きコンパイルについて学ぼう

条件付きコンパイルとは

条件付きコンパイルとはコンパイル時にプログラムコードの一部を切り取る機能(コンパイル対象外とする機能)です。

また、コンパイル時にプログラムコードを変換する機能全般のことを「プリプロセッサ」と呼びます。

主なプリプロセッサとして、次の3つが存在します。

  • マクロ定義
  • インクルード
  • 条件付きコンパイル

※マクロ定義については<【独学C言語入門⑳】マクロ定義について学ぼう【#define】>をご参照ください。

※インクルードについては<【独学C言語入門⑲】複数Cソースを管理しよう>を一読すると理解できると思います。

条件付きコンパイルの構文と使用例

条件付きコンパイルは大きく分けて次の2つに分類できます。

  • #if - #endif
  • #ifdef - #endif

【#if - #endif】

まず、1つ目の条件付きコンパイルとして「#if - #endif」について解説します。これは「#if」に続く定数式がtrueであれば、「#endif」までの間のコードがコンパイルされるといったものです。

「#if - #endif」の書き方や考え方は「if文」とかなり似ています。基本的な構文・使用例は次のようになります。

【構文】

#if 定数式
    定数式がの場合にコンパイルされる
#endif

【使用例】

#if 1
    printf( "Compile Target." );
#endif

【#ifdef - #endif】

もう1つの条件付きコンパイル方法として「#ifdef - #endif」について解説します。これは「#ifdef」に続くマクロ名が定義されている場合、「#endif」までの間のコードがコンパイルされるといったものです。

構文と使用例は次のようになります。

【構文】

#ifdef マクロ名
    マクロ名が定義されている場合にコンパイルされる
#endif

【使用例】

#define APPLE    0

#ifdef APPLE
    printf( "APPLE is defined." );
#endif


また、似た機能として「#ifndef - #endif」というものがあります。こちらは逆に「#ifdef」に続くマクロ名が定義されていない場合、「#endif」までの間のコードがコンパイルされるといったものです

構文と使用例は次のようになります。

【構文】

#ifndef マクロ名
    マクロ名が定義されていない場合にコンパイルされる
#endif

【使用例】

#define APPLE    0

#ifndef ORANGE
    printf( "ORANGE is not defined." );
#endif

条件付きコンパイルの多分岐【#else】【#elif】

「if文」と同様、条件付きコンパイルも条件分岐を行うことができます。

それには、「#else」「#elif」を使用します。「if文」でいうと次の関係性であると考えてもらえればOKです。

  • 「#else」=「else」
  • 「#elif」=「else if」

それでは基本的な構文と使用例を紹介します。

【構文】

#if 定数式①
    定数式①がの場合にコンパイルされる
#elif 定数式②
    定数式①がかつ条件式②がの場合にコンパイルされる
#else
    全ての定数式がの場合にコンパイルされる
#endif

【使用例】

#define MAX_VAL  100

#if MAX_VAL>100
    printf( "Compile Target No.1" );
#elif MAX_VAL>10
    printf( "Compile Target No.2" );
#else
    printf( "Compile Target No.3" );
#endif

賢い皆さんならお分かりだと思いますが、「#elif」は複数個記述することができます。

また、これもお分かりだと思いますが「#else」「#elif」は省略可能です。つまり、必要な分のみ記述するだけで良いです。


また、当然ながら条件分岐は「#ifdef」「#ifndef」にも使用可能です。

【使用例】

#define APPLE    0
#define ORANGE   1


#ifdef APPLE
    printf( "APPLE is defined." );
#else
    printf( "APPLE is not defined." );
#endif

#ifndef ORANGE
    printf( "ORANGE is not defined." );
#else
    printf( "ORANGE is defined." );
#endif

defined用法

実は「#ifdef」を用いなくても、「マクロ名が定義されているか」を判定することができます。それは、「#if」を「defined」と同時に使用する方法です。

それでは、使用例を見ていきましょう。次の2つの書き方は同じ意味となります。

#if defined APPLE
    printf( "APPLE is defined." );
#endif
#ifdef APPLE
    printf( "APPLE is defined." );
#endif


ちなみに、definedの前には"!"を付与することで条件を反転させることもできます。

#if !defined APPLE
    printf( "APPLE is not defined." );
#endif

次回以降は番外編

今回は「条件付きコンパイル」について学んでもらいました。可読性・保守性の向上には必須の機能なのでしっかり習得しておいてください。

次回は「条件付きコンパイル」について解説します。C言語プログラミングでは煩わしい制約がいくつかあったと思います。

「条件付きコンパイル」を習得すると、一部の煩わしい制約が緩和されます。つまり、更に簡略化したプログラムコードを書くことができるようになります。

ご期待ください。

タイトルとURLをコピーしました