C - プリプロセッサ
C プリプロセッサ コンパイラの一部ではありませんが、コンパイル プロセスの別のステップです。簡単に言えば、C プリプロセッサは単なるテキスト置換ツールであり、実際のコンパイルの前に必要な前処理を行うようコンパイラに指示します。 C プリプロセッサを CPP と呼びます。
すべてのプリプロセッサ コマンドは、ハッシュ記号 (#) で始まります。これは空白以外の最初の文字である必要があり、読みやすくするために、プリプロセッサ ディレクティブは最初の列から開始する必要があります。次のセクションでは、すべての重要なプリプロセッサ ディレクティブを一覧表示します −
Sr.No. | 指令と説明 |
---|---|
1 | #define プリプロセッサ マクロを置き換えます。 |
2 | #include 別のファイルから特定のヘッダーを挿入します。 |
3 | #undef プリプロセッサ マクロの定義を解除します。 |
4 | #ifdef このマクロが定義されている場合は true を返します。 |
5 | #ifndef このマクロが定義されていない場合は true を返します。 |
6 | #if コンパイル時の条件が true かどうかをテストします。 |
7 | #else #if の代替。 |
8 | #elif #else と #if を 1 つのステートメントで。 |
9 | #endif 条件付きでプリプロセッサを終了します。 |
10 | #エラー stderr にエラー メッセージを出力します。 |
11 | #pragma 標準化された方法を使用して、コンパイラに特別なコマンドを発行します。 |
プリプロセッサの例
次の例を分析して、さまざまなディレクティブを理解してください。
#define MAX_ARRAY_LENGTH 20
このディレクティブは、MAX_ARRAY_LENGTH のインスタンスを 20 に置き換えるよう CPP に指示します。#define を使用します。 可読性を高めるための定数。
#include <stdio.h> #include "myheader.h"
これらのディレクティブは、CPP に システム ライブラリ から stdio.h を取得するように指示します。 現在のソース ファイルにテキストを追加します。次の行は、CPP に myheader.h を取得するように指示します。 ローカル ディレクトリからコンテンツを現在のソース ファイルに追加します。
#undef FILE_SIZE #define FILE_SIZE 42
これは、既存の FILE_SIZE の定義を解除し、42 として定義するように CPP に指示します。
#ifndef MESSAGE #define MESSAGE "You wish!" #endif
MESSAGE がまだ定義されていない場合にのみ、MESSAGE を定義するように CPP に指示します。
#ifdef DEBUG /* Your debugging statements here */ #endif
DEBUG が定義されている場合は、囲まれたステートメントを処理するように CPP に指示します。これは、-DDEBUG を渡す場合に便利です コンパイル時に gcc コンパイラにフラグを付けます。これにより DEBUG が定義されるため、コンパイル中にオンザフライでデバッグのオンとオフを切り替えることができます。
定義済みマクロ
ANSI C では、多数のマクロが定義されています。それぞれがプログラミングで使用できますが、事前定義されたマクロは直接変更しないでください。
Sr.No. | マクロと説明 |
---|---|
1 | __DATE__ 「MMM DD YYYY」形式の文字リテラルとしての現在の日付。 |
2 | __TIME__ 「HH:MM:SS」形式の文字リテラルとしての現在の時刻。 |
3 | __FILE__ これには、現在のファイル名が文字列リテラルとして含まれています。 |
4 | __LINE__ これには、現在の行番号が 10 進定数として含まれます。 |
5 | __STDC__ コンパイラが ANSI 標準に準拠している場合は 1 として定義されます。 |
次の例を試してみましょう −
ライブデモ#include <stdio.h> int main() { printf("File :%s\n", __FILE__ ); printf("Date :%s\n", __DATE__ ); printf("Time :%s\n", __TIME__ ); printf("Line :%d\n", __LINE__ ); printf("ANSI :%d\n", __STDC__ ); }
上記のコードがファイル test.c の場合 コンパイルして実行すると、次の結果が生成されます-
File :test.c Date :Jun 2 2012 Time :03:36:24 Line :8 ANSI :1
プリプロセッサ オペレータ
C プリプロセッサは、マクロの作成を支援する次の演算子を提供します −
マクロ継続 (\) 演算子
通常、マクロは 1 行に限定されます。マクロ継続演算子 (\) は、長すぎて 1 行に収まらないマクロを継続するために使用されます。たとえば-
#define message_for(a, b) \ printf(#a " and " #b ": We love you!\n")
ストリング化 (#) 演算子
文字列化または番号記号演算子 ( '#' ) をマクロ定義内で使用すると、マクロ パラメーターが文字列定数に変換されます。この演算子は、指定された引数またはパラメーター リストを持つマクロでのみ使用できます。たとえば-
ライブデモ#include <stdio.h> #define message_for(a, b) \ printf(#a " and " #b ": We love you!\n") int main(void) { message_for(Carole, Debra); return 0; }
上記のコードをコンパイルして実行すると、次の結果が生成されます −
Carole and Debra: We love you!
トークン貼り付け (##) 演算子
マクロ定義内のトークン貼り付け演算子 (##) は、2 つの引数を結合します。これにより、マクロ定義内の 2 つの個別のトークンを結合して 1 つのトークンにすることができます。たとえば-
ライブデモ#include <stdio.h> #define tokenpaster(n) printf ("token" #n " = %d", token##n) int main(void) { int token34 = 40; tokenpaster(34); return 0; }
上記のコードをコンパイルして実行すると、次の結果が生成されます −
token34 = 40
この例では、プリプロセッサから次の実際の出力が得られるため、これが発生しました-
printf ("token34 = %d", token34);
この例は、token##n の token34 への連結を示しています。ここでは、両方の stringize を使用しています。 とトークンの貼り付け .
Defined() 演算子
定義済みのプリプロセッサ 演算子は定数式で使用され、#define を使用して識別子が定義されているかどうかを判断します。指定された識別子が定義されている場合、値は true (ゼロ以外) です。シンボルが定義されていない場合、値は false (ゼロ) です。定義された演算子は次のように指定されます −
ライブデモ#include <stdio.h> #if !defined (MESSAGE) #define MESSAGE "You wish!" #endif int main(void) { printf("Here is the message: %s\n", MESSAGE); return 0; }
上記のコードをコンパイルして実行すると、次の結果が生成されます −
Here is the message: You wish!
パラメータ化されたマクロ
CPP の強力な機能の 1 つは、パラメーター化されたマクロを使用して機能をシミュレートする機能です。たとえば、次のように数を二乗するコードがあるかもしれません −
int square(int x) { return x * x; }
次のように、マクロを使用して上記のコードを書き換えることができます −
#define square(x) ((x) * (x))
引数を持つマクロは、#define を使用して定義する必要があります ディレクティブを使用する前に。引数リストは括弧で囲まれ、マクロ名の直後に続く必要があります。マクロ名と左括弧の間にスペースを入れることはできません。たとえば-
ライブデモ#include <stdio.h> #define MAX(x,y) ((x) > (y) ? (x) : (y)) int main(void) { printf("Max between 20 and 10 is %d\n", MAX(10, 20)); return 0; }
上記のコードをコンパイルして実行すると、次の結果が生成されます −
Max between 20 and 10 is 20
C言語