今回は《条件付きコンパイルについて学ぼう》というテーマで記事をまとめます。
「条件付きコンパイル」を習得すると、コンパイル時にプログラムの無効化・プログラムの切り替えなどができるようになります。強力な機能の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言語プログラミングでは煩わしい制約がいくつかあったと思います。
「条件付きコンパイル」を習得すると、一部の煩わしい制約が緩和されます。つまり、更に簡略化したプログラムコードを書くことができるようになります。
ご期待ください。