【C言語】プリプロセッサ / Preprocessor
【C言語】
プリプロセッサ / Preprocessor
プリプロセッサとは
「プリプロセッサ」は、
ソフトウェアの分類の一つで、
プログラミングコードを実行する前に、
前処理を行うプログラミング。
「コンパイラ」に
コンパイル方法を伝達する役割を持っている
重要なプログラミングの一つ。
前処理の「プリプロセッサ」と同じく、
メインの処理の後に、
後処理を行うプログラミングを
「ポストプロセッサ(postprosessor)」という。
Back
「プリプロセッサ」の種類
「プリプロセッサ」には、
いくつかの種類があり、
それぞれを駆使して、
「コンパイラ」に「コンパイル」の方法を指示します。
「C言語」では、
「#ifndef」「#define」「#endif」を使ったコードが定番。
msdn「プリプロセッサ」 - (マイクロソフトのライブラリ)
http://msdn.microsoft.com/ja-jp/library/3sxhs2ty.aspx
>
「プリプロセッサ」の種類
プリプロセッサ | 説明 |
#define | マクロ定義 |
#error | |
#import | |
#undef | |
#etdf | |
#if | 条件分岐 |
#include | 読み込むヘッダファイルを指定する |
#using | |
#else | 条件分岐で指定した内容と異なる場合の処理を記述する |
#ifdef | 定数として定義されていれば実行する条件分岐 |
#tdne | |
#endif | 「if」が付く条件分岐の範囲を終了とするマーク |
#ifndef | 定数として定義されていなければ実行する条件分岐 |
#pragma | プラグマは、コンパイル時に、コンパイラの設定を一時的に変更したいときなどに使用。 |
Back
「#if」の使い方
「#if」を使った書式
#if 条件式1
条件式1が「真」のときに実行されるコード
#elif 条件式2
条件式2が「真」のときに実行されるコード
#else
条件式1と条件式2の両方が「偽」となるときのコード
#endif
Back
「#ifdef」の使い方
「#ifdef マクロ名 ~ #else ~ #endif」は、
マクロが定義されていたならば、
「#ifdef」と「#else」の間が実行され、
「#else」と「#endif」 の間は、
マクロが定義されていない場合に実行される。
「#else」がない場合は、
「#endif」までの間が実行される。
マクロが定義されていないならば、
「#else」と「#endif」の間の行が有効となり、コンパイルされる。
「#ifndef マクロ名 ~ #else ~ #endif」は、
「#ifdef」とは逆の意味になり、
「マクロ名」が、「#define」で定義されてない時にかぎり、
「#ifndef」マクロ名 と「#else」の間が有効となり、
コンパイルが実行される。
マクロが定義されているならば、
「#else」と「#endif」の間の行が有効となり、
コンパイルが実行される。
プリプロセッサディレクティブの構文
条件式に「 defined 」
マクロが定義されているかどうかを判定する。
記述方法は、下記のように複数ある。
#ifdef A
#if defined(A)
#ifndef A
#if !defined(A)
「#ifdef」を使った書式
#ifdef マクロ名
マクロ名が「#define」で定義されている時に記述内容を実行する
#else
マクロ名が「#define」で定義されていない時に記述内容を実行する
#endif
#ifndef マクロ名
マクロ名が「#define」で定義されていない時に記述内容を実行する
#else
マクロ名が「#define」で定義されている時に記述内容を実行する
#endif
Back
「#include」の使い方
#include
ヘッダファイルの呼び込み
#include <header.h>
ヘッダファイル保存ディレクトリからヘッダファイルを探す
#include "header.h"
カレントディレクトリをまず探し、その後、ヘッダファイル保存ディレクトリから探す。
Back
「#define」の使い方
#define は 文字列1 を文字列2 で置き換える
#define = 「マクロ定義」
単に定数の「6」を用いるよりも、「NINZU」とマクロ定義した方が意味がわかりやすくなる。
プログラムの変更が生じ、学生数が「6」から他の数値になったときに、#define 定義を修正するだけで対応できる。
記号定数は他の変数と区別するために大文字で記述するとよい。
文字列2 の部分には、既にマクロ定義されている記号定数を用いることもできる。
「#define」の記述方法
構文
#define 文字列1 文字列2
ーーー「文字列1」を記号定数とも呼ぶ
#difine sample01 sample02
ーーー「sample01」と記述すると、「sample02」と記述したことになる。
Back
「#pragma」の使い方
- プラグマは、コンパイル時に、コンパイラの設定を一時的に変更したいときなどに使用。
- どのようなコマンドが使用できるかは、コンパイラに依存する。
- コンパイラが対応していないプラグマは、無視される。
#pragma コマンド
#pragma once
ヘッダファイルの先頭に記述。
そのヘッダファイルは、一度だけしかインクルードされないようになる。
Back
「#paragmamessage」の使い方
「#paragmamessage」は、
ビルド時にメッセージを出す「プリプロセッサ」。
「#paragmamessage」の書式
#paragmamessage("メッセージ")
Back
「#error」の使い方
「#error」は、
「ビルドエラー」時にしたい表示したい内容を記述する「プリプロセッサ」。
#error "エラーメッセージ"
Back
コンパイラ定義済みのマクロ
__cplusplus |
C++のときに定義される
|
_MSC_VER |
Visual C++のときに定義される。コンパイラのバージョン
|
__APPLE__ |
Mac OS XのGCCやLLVMで定義される。
|
__linux__ |
LinuxのGCCで定義される。
|
Back