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プログラミングにおける定義済みマクロの一部である。

ANSI 標準 C. に従う場合。 の場合、値は0でない整数

マクロ
__DATE__ 現在の日付を含む文字列
__FILE__ A ファイル名を含む文字列
__LINE__ 現在の行番号を表す整数
__STDC__
__TIME__ 現在の日付を含む文字列です。

例3: __TIME__

を使って現在の時刻を取得する

以下のプログラムは __TIME__ マクロを使って現在の時刻を出力するものである。

#include <stdio.h>int main(){ printf("Current time: %s",__TIME__); }

出力

Current time: 19:54:39

推薦図書

  • 行制御
  • プラグラ
  • プリプロセッサ出力
  • その他のディレクティブ

コメントを残す

メールアドレスが公開されることはありません。