C ++プリプロセッサ
いくつかのプリプロセッサディレクティブ、あなたが完了する必要があり、実際のコンパイルの前にコンパイラにプリプロセッサに指示します。
すべてのプリプロセッサディレクティブは、シャープ記号で始まる(#)は、唯一の空白文字は、プリプロセッサディレクティブの前に表示されることがあります。 C ++プリプロセッサ・ディレクティブは、ステートメントではありませんので、セミコロンではありません。末尾に()。
私たちは、以前のすべてのインスタンスがの#includeディレクティブを持って見てきました。 このマクロは、ヘッダファイルがソースファイルに含まれて使用されます。
C ++はまた、などの前処理ディレクティブ、#などが含まれ、#を定義、もし#、他の#、#行の数をサポートし、私たちはこれらの重要な指示を見てみましょう。
#define前処理
#defineプリプロセッサ・ディレクティブは、シンボル定数を作成するために使用されます。 シンボリック定数は通常、マクロと呼ばれ、一般的なコマンドの形式は次のとおりです。
#define macro-name replacement-text
このコード行がファイルに表示された場合、ファイルは、プログラムがコンパイルされる前にすべてのマクロを置換テキストに置き換えられます、後続に表示されます。 例えば:
#include <iostream> using namespace std; #define PI 3.14159 int main () { cout << "Value of PI :" << PI << endl; return 0; }
さて、このコードをテストするには、前処理の結果を見てみましょう。 コンパイルするとtest.p.に結果をリダイレクトするように-Eオプションを使用し、その後、ソースファイルが既に存在すると仮定 あなたはtest.pファイルを見れば今、あなたはそれが既に多くの情報が含まれており、次のように値がファイルの最後に変更されたことが表示されます。
$gcc -E test.cpp > test.p ja. 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
条件付きコンパイル
コンパイルされたプログラムのソースコードの一部に選択的に使用することができるいくつかのコマンドがあります。 このプロセスは、条件付きコンパイルとして知られています。
構造と多くのプリプロセッサのような場合、構造条件を選択します。 次の一節プリプロセッサコードを考えてみます。
#ifndef NULL #define NULL 0 #endif
あなたは、デバッグしてコンパイルした場合にのみ、以下のように、デバッグは、マクロを使用して実現することができます行うことができます。
#ifdef DEBUG cerr <<"Variable x = " << x << endl; #endif
命令の#ifdef DEBUGがシンボリック定数DEBUGが定義されている前の場合は、コンパイルされたプログラムのCERR文になります。 次のように、プログラムのステートメント一部アウト0コメントの#if使用することができます。
#if 0 不进行编译的代码 #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 /* 这是注释部分 */ 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; }
上記のコードはコンパイルされ、実行されると、次の結果を生成します。
Trace: Inside main function The minimum is 30 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(ハロー、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 ++は、いくつかの定義済みのマクロ以下の表にあります。
宏 | 描述 |
---|---|
__LINE__ | 这会在程序编译时包含当前行号。 |
__FILE__ | 这会在程序编译时包含当前文件名。 |
__DATE__ | 这会包含一个形式为 month/day/year 的字符串,它表示把源文件转换为目标代码的日期。 |
__TIME__ | 这会包含一个形式为 hour:minute:second 的字符串,它表示程序被编译的时间。 |
私たちはこれらのマクロの例を見てみましょう:
#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