C言語の条件付きコンパイルとは?#if・#ifdefなどのディレクティブを解説
C言語には、プログラムコードの一部を選択的にコンパイル(条件付きコンパイル)するためのプリプロセッサディレクティブが複数用意されています。主なものは以下のとおりです。
- #if
- #else
- #elif
- #endif
#if の基本形式
#if の一般的な書式は次のとおりです。
#if 定数式
文の並び
#endif
定数式が真(0以外)の場合のみ、#endif までのコードがコンパイルされます。
#else は、C言語のキーワード else とほぼ同じ働きをし、条件が偽の場合にコンパイルされるコードを指定できます。
#elif は「else if」を意味し、複数の条件を順に評価する if〜else if のようなコンパイル分岐チェーンを構築できます。
#if でコードをコメントアウトする
#if の便利な使い方のひとつが、コードを「コメントアウト」する代替手法としての活用です。
たとえば、次のように記述します。
#if 0
printf("%d", total);
#endif
この場合、条件式が 0(偽)であるため、コンパイラは printf 文を完全に無視します。/* */ コメントでは入れ子にできないため、既存のコメントが含まれるコードを一時的に無効化したい場合に特に有効です。
#ifdef と #ifndef
#ifdef は「if defined(定義されていれば)」を意味し、#endif で終了します。指定したマクロが定義されている場合にのみ、ブロック内のコードがコンパイルされます。
#ifndef は「if not defined(定義されていなければ)」を意味し、マクロが未定義の場合にコードをコンパイルします。ヘッダファイルの二重インクルード防止などによく使われます。
#undef
#undef は、それまでに定義されていたマクロ定義を解除(削除)します。
#line
#line は、現在コンパイル中のコード行番号を保持する __LINE__ と、コンパイル対象のソースファイル名を格納する文字列 __FILE__ の内容を変更します。これらはいずれもコンパイラによって事前定義されている識別子です。
#pragma
#pragma ディレクティブは処理系(実装)依存のディレクティブで、コンパイラに対してさまざまな指示を与えるために使用されます。
サンプルプログラム
以下は、#ifdef、#ifndef、#else、#endif の動作を確認するC言語のサンプルプログラムです。
#include <stdio.h>
#define a 10
void main(){
#ifdef a
printf("\n Hello I am here..");
#endif
#ifndef a
printf("\n Not defined ");
#else
printf("\n R u There ");
#endif
}
実行結果
このプログラムを実行すると、次の出力が得られます。
Hello I am here..
R u There
マクロ a が定義されているため、#ifdef ブロック内のメッセージが出力され、#ifndef の条件は偽となるため #else 側のメッセージが表示されます。このように条件付きコンパイルを使うことで、同じソースコードから環境や設定に応じて異なるバイナリを生成できます。
-
C言語のstrcmp()関数とは?文字列比較の基本と使い方を徹底解説
C言語の標準ライブラリ関数 int strcmp(const char *str1, const char *str2) は、ポインタ str1 が指し示す文字列と、str2 が指し示す文字列を比較するための関数です。C言語において、文字型の配列は「文字列」と呼ばれます。まずは文字列の基本的な扱い方から確認していきましょう。文字列の宣言文字列(文字配列)の宣言は以下のように行います。char stringname [size];例えば、char string[50]; と宣言すれば、最大50文字の長さを持つ文字列を格納できます。文字列の初期化文字列の初期化には、主に次の2つの方法があります。1
-
C#プログラミングとは?初心者にもわかる特徴と基本を徹底解説
C#(シーシャープ)とは何かC#は、Microsoft(マイクロソフト)が開発したモダンで汎用性の高いオブジェクト指向プログラミング言語です。Windowsアプリケーションの開発をはじめ、Webサービス、ゲーム開発(Unity)、業務システムなど、幅広い分野で活用されています。C#は「共通言語基盤(CLI:Common Language Infrastructure)」向けに設計されています。CLIは実行可能なコードとランタイム環境から構成されており、これにより異なるコンピュータプラットフォームやアーキテクチャ上で、さまざまな高水準言語を利用できるようになっています。C#の主な特徴C#には、開