C++ プリプロセッサ
プリプロセッサはディレクティブであり、実際のコンパイルが開始される前に情報を前処理するようコンパイラに指示します。
すべてのプリプロセッサ ディレクティブは # で始まり、空白文字のみが行のプリプロセッサ ディレクティブの前に表示されます。プリプロセッサ ディレクティブは C++ ステートメントではないため、セミコロン (;) で終わりません。
#include は既に見ました すべての例でディレクティブ。このマクロは、ヘッダー ファイルをソース ファイルに含めるために使用されます。
#include、#define、#if、#else、#line など、C++ でサポートされている多数のプリプロセッサ ディレクティブがあります。重要なディレクティブを見てみましょう −
#define プリプロセッサ
#define プリプロセッサ ディレクティブは、記号定数を作成します。記号定数はマクロと呼ばれます ディレクティブの一般的な形式は −
#define macro-name replacement-text
この行がファイルに現れると、プログラムがコンパイルされる前に、そのファイル内の後続のすべてのマクロが replacement-text に置き換えられます。たとえば-
#include <iostream> using namespace std; #define PI 3.14159 int main () { cout << "Value of PI :" << PI << endl; return 0; }
ここで、ソース コード ファイルがあると仮定して、このコードの前処理を行って結果を確認しましょう。 -E オプションを付けてコンパイルし、結果を test.p にリダイレクトします。ここで、test.p を確認すると、多くの情報が含まれており、下部に次のように値が置き換えられていることがわかります −
$gcc -E test.cpp > test.p ... int main () { cout << "Value of PI :" << 3.14159 << endl; return 0; }
関数のようなマクロ
#define を使用して、次のように引数を取るマクロを定義できます −
ライブデモ#include <iostream> using namespace std; #define MIN(a,b) (((a)<(b)) ? a : b) int main () { int i, j; i = 100; j = 30; cout <<"The minimum is " << MIN(i, j) << endl; return 0; }
上記のコードをコンパイルして実行すると、次の結果が生成されます −
The minimum is 30
条件付きコンパイル
プログラムのソース コードの選択的な部分をコンパイルするために使用できるディレクティブがいくつかあります。このプロセスは条件付きコンパイルと呼ばれます。
条件付きプリプロセッサ構造は、「if」選択構造によく似ています。次のプリプロセッサ コードを検討してください −
#ifndef NULL #define NULL 0 #endif
デバッグ目的でプログラムをコンパイルできます。次のように、単一のマクロを使用してデバッグをオンまたはオフにすることもできます −
#ifdef DEBUG cerr <<"Variable x = " << x << endl; #endif
これにより、cerr が発生します 記号定数 DEBUG がディレクティブ #ifdef DEBUG の前に定義されている場合、プログラムでコンパイルされるステートメント。次のように #if 0 ステートメントを使用して、プログラムの一部をコメントアウトできます −
#if 0 code prevented from compiling #endif
次の例を試してみましょう −
ライブデモ#include <iostream> using namespace std; #define DEBUG #define MIN(a,b) (((a)<(b)) ? a : b) int main () { int i, j; i = 100; j = 30; #ifdef DEBUG cerr <<"Trace: Inside main function" << endl; #endif #if 0 /* This is commented part */ cout << MKSTR(HELLO C++) << endl; #endif cout <<"The minimum is " << MIN(i, j) << endl; #ifdef DEBUG cerr <<"Trace: Coming out of main function" << endl; #endif return 0; }
上記のコードをコンパイルして実行すると、次の結果が生成されます −
The minimum is 30 Trace: Inside main function Trace: Coming out of main function
# および ## 演算子
# および ## プリプロセッサ演算子は、C++ および ANSI/ISO C で使用できます。 # 演算子により、置換テキスト トークンが引用符で囲まれた文字列に変換されます。
次のマクロ定義を検討してください −
ライブデモ#include <iostream> using namespace std; #define MKSTR( x ) #x int main () { cout << MKSTR(HELLO C++) << endl; return 0; }
上記のコードをコンパイルして実行すると、次の結果が生成されます −
HELLO C++
それがどのように機能したか見てみましょう。 C++ プリプロセッサが行を変更することを理解するのは簡単です −
cout << MKSTR(HELLO C++) << endl;
上記の行は次の行に変わります −
cout << "HELLO C++" << endl;
## 演算子は、2 つのトークンを連結するために使用されます。ここに例があります-
#define CONCAT( x, y ) x ## y
CONCAT がプログラムに現れると、その引数が連結され、マクロを置き換えるために使用されます。たとえば、CONCAT(HELLO, C++) は、次のようにプログラム内で "HELLO C++" に置き換えられます。
ライブデモ#include <iostream> using namespace std; #define concat(a, b) a ## b int main() { int xy = 100; cout << concat(x, y); return 0; }
上記のコードをコンパイルして実行すると、次の結果が生成されます −
100
それがどのように機能したか見てみましょう。 C++ プリプロセッサが変換することを理解するのは簡単です −
cout << concat(x, y);
上記の行は次の行に変換されます −
cout << xy;
定義済み C++ マクロ
C++ には、以下に示す定義済みのマクロが多数用意されています −
Sr.No | マクロと説明 |
---|---|
1 | __LINE__ これには、コンパイル中のプログラムの現在の行番号が含まれます。 |
2 | __FILE__ これには、コンパイル中のプログラムの現在のファイル名が含まれます。 |
3 | __DATE__ これには、ソース ファイルをオブジェクト コードに変換した日付である月/日/年の形式の文字列が含まれます。 |
4 | __TIME__ これには、プログラムがコンパイルされた時刻である時:分:秒の形式の文字列が含まれます。 |
上記のすべてのマクロの例を見てみましょう −
ライブデモ#include <iostream> using namespace std; int main () { cout << "Value of __LINE__ : " << __LINE__ << endl; cout << "Value of __FILE__ : " << __FILE__ << endl; cout << "Value of __DATE__ : " << __DATE__ << endl; cout << "Value of __TIME__ : " << __TIME__ << endl; return 0; }
上記のコードをコンパイルして実行すると、次の結果が生成されます −
Value of __LINE__ : 6 Value of __FILE__ : test.cpp Value of __DATE__ : Feb 28 2011 Value of __TIME__ : 18:52:48
C言語