C プリプロセッサはマクロプリプロセッサ(マクロを定義できる)であり、コンパイル前にプログラムを変形させるものである。 これらの変換は、ヘッダーファイルのインクルージョン、マクロの拡張などです。
すべてのプリプロセッシング命令は #
シンボルから始まります。 たとえば、
#define PI 3.14
C プリプロセッサの一般的な使用法は次のとおりです。
The #include
プリプロセッサは、C プログラムにヘッダー・ファイルをインクルードするために使用されます。 例えば、
#include <stdio.h>
ここで、stdio.h
はヘッダ・ファイルである。 #include
プリプロセッサ指令は、上の行をstdio.h
ヘッダファイルの内容に置き換えます。
これが、scanf()
やprintf()
といった関数を使う前に#include <stdio.h>
を使う必要がある理由です。
また、関数宣言を含む独自のヘッダーファイルを作成し、このプリプロセッサ指令を使用してプログラムに含めることもできます。
#include "my_header.h"
ヘッダーファイルの使用については、このページを参照してください。
#define
によるマクロ
マクロとは名前を与えられたコード片のことです。 C言語では#define
プリプロセッサ指令を使ってマクロを定義できます。
#define c 299792458 // speed of light
以下はその例です。
ここで、プログラムの中でcを使うと、299792458
に置き換えられます。
例1: #define preprocessor
#include <stdio.h>#define PI 3.1415int main(){ float radius, area; printf("Enter the radius: "); scanf("%f", &radius); // Notice, the use of PI area = PI*radius*radius; printf("Area=%.2f",area); return 0;}
関数ライクなマクロ
関数呼び出しと同様の働きをするマクロを定義することも可能です。 これは、関数ライクマクロとして知られています。 例えば、
#define circleArea(r) (3.1415*(r)*(r))
プログラムが circleArea(argument)
に遭遇するたびに、それは (3.1415*(argument)*(argument))
で置き換えられる。
引数として 5 を渡したとすると、次のように展開されます。
circleArea(5) expands to (3.1415*5*5)
例 2: #define プリプロセッサの使用
#include <stdio.h>#define PI 3.1415#define circleArea(r) (PI*r*r)int main() { float radius, area; printf("Enter the radius: "); scanf("%f", &radius); area = circleArea(radius); printf("Area = %.2f", area); return 0;}
マクロと #define プリプロセッサについてもっと学ぶにはこのページをご覧ください。
Conditional Compilation
Cプログラミングにおいて、プリプロセッサに対してコードブロックが含まれているかどうか指示を与えることができます。
これはif
文と似ているが、大きな違いが1つある。if
文は実行時にテストされ、コードのブロックが実行されるべきかどうかをチェックするが、条件文は実行前にプログラム内のコードのブロックを含める(またはスキップ)ために使用されるのである。
条件式の用途
- マシンやオペレーティング システムによって異なるコードを使用する
- 同じソース ファイルを 2 つの異なるプログラムでコンパイルする
- プログラムから特定のコードを除外するが将来の目的のために参照として保持する
条件式を使用するにはどうすればいいですか?
条件指定を行うには、#ifdef
, #if
, #defined
, #else
, #elseif
ディレクティブが使用されます。
#ifdef 命令
#ifdef MACRO // conditional codes#endif
ここで、条件コードはMACROが定義されている場合のみプログラムに含まれます。
#if, #elif, #else 命令
#if expression // conditional codes#endif
ここで、式とは整数型(整数、文字、演算式、マクロ等可)の式であることを示します。
条件コードは、expressionが評価されて0以外の値になった場合のみプログラムに含まれます。
オプションの#else
指令は#if
指令と併用することが可能です。
#if expression conditional codes if expression is non-zero#else conditional if expression is 0#endif
また、#elif
#if expression // conditional codes if expression is non-zero#elif expression1 // conditional codes if expression is non-zero#elif expression2 // conditional codes if expression is non-zero#else // conditional if all expressions are 0#endif
#defined
特殊演算子 #defined は、あるマクロが定義されているかどうかをテストするために使用されるものです。 これはしばしば#ifディレクティブと一緒に使われる。
#if defined BUFFER_SIZE && BUFFER_SIZE >= 2048 // codes
定義済みマクロ
以下はCプログラミングにおける定義済みマクロの一部である。
マクロ | 値 |
---|---|
__DATE__ |
現在の日付を含む文字列 |
__FILE__ |
A ファイル名を含む文字列 |
__LINE__ |
現在の行番号を表す整数 |
__STDC__ |
|
__TIME__ |
現在の日付を含む文字列です。 |
例3: __TIME__
を使って現在の時刻を取得する
以下のプログラムは __TIME__
マクロを使って現在の時刻を出力するものである。
#include <stdio.h>int main(){ printf("Current time: %s",__TIME__); }
出力
Current time: 19:54:39
推薦図書
- 行制御
- プラグラ
- プリプロセッサ出力
- その他のディレクティブ