preprocessor directives c
C ++のプリプロセッサディレクティブの詳細。
プリプロセッサはC ++のユニークな機能です。 C ++には、一般的なプログラムのコンパイル、リンク、実行などの手順があります。実際には、C ++プログラムには、コンパイルのためにプログラムを渡す前に処理する必要のある他の多くの機能があります。
この目的のために、前処理と呼ばれる特別なステップが実行されます。前処理はコンパイルプロセスの前に実行され、特別な機能が前処理されます。その結果、拡張されたC ++プログラムが取得され、コンパイラーに渡されます。
=> ゼロからC ++を学ぶには、ここにアクセスしてください。
学習内容:
概要概要
前処理の特別な機能は、「プリプロセッサディレクティブ」と呼ばれるエンティティを使用して識別されます。これらのプリプロセッサディレクティブは、プリプロセッサディレクティブでマークされたC ++プログラムの特定の情報を、コンパイル前に前処理する必要があることをコンパイラに通知します。
C ++では、すべてのプリプロセッサディレクティブが「#」記号で始まることに注意してください。プリプロセッサ(コンパイラの一部)が#記号に遭遇すると、プログラムをコンパイラに渡す前に、#記号に続く情報が前処理されます。
他のC ++ステートメントとは異なり、プリプロセッサディレクティブはセミコロンで終わりません。
このチュートリアルでは、C ++でサポートされているさまざまなプリプロセッサディレクティブについて説明します。
ファイルインクルードディレクティブ
#include
ファイルインクルードディレクティブ#includeを使用すると、ソースプログラムに他のファイルを含めることができます。これらの関数を使用して、さまざまな定義済み関数の定義を含むヘッダーファイルをプログラムにインクルードできます。次の構文を使用して、プログラムにヘッダーファイルを含めることができます。
#include 例: #include
これはC ++プログラムですでに見ています。ヘッダーiostreamには、cout、cinなどの入出力データストリーミングに必要な機能が含まれています。
プログラムが大きくなったり、機能が複雑になったりすると、プログラムをさまざまなファイルに分割したり、他のファイルから機能をインポートしたりすることができます。この場合、ユーザー定義ファイルを利用します。プログラムにユーザー定義ファイルを含めるには、次の#includeディレクティブの構文を使用できます。
#include “filename” 例: #include“ vector_int.h”
これは、その機能を使用するためにプログラムに含める予定のユーザー定義のヘッダーファイルです。
以下のコード例は、#includeディレクティブの使用法を示しています。
テスターのためのPythonインタビューの質問と回答
#include using namespace std; int main() { cout<<'This is an example demonstrating inclusion directive #include'; }出力:
これは、包含ディレクティブ#includeを示す例です。
示されているように、#includeディレクティブを使用して、プログラムにヘッダーの機能を含めました。
マクロ定義ディレクティブ
#define
#defineディレクティブは、C ++プログラムでシンボリック定数またはマクロを定義するために使用されます。
#defineディレクティブの一般的な形式は次のとおりです。
#define macro_name replacement code プリプロセッサがプログラム内のマクロを検出すると、プリプロセッサは、コードがコンパイラに渡される前に、このマクロを#defineディレクティブを使用して定義されたコードに置き換えます。
以下のコード例は、#defineディレクティブを使用して定義されたシンボリック定数RADIUSとプログラムでのその使用法を示しています。
#include #define RADIUS 5 using namespace std; int main() { cout<<'Area of a circle : '<<3.142 * RADIUS * RADIUS; }出力:
円の面積:78.55
プログラムに示されているように、コードでシンボリック定数RADIUSを使用でき、#defineディレクティブを使用して定義された値に置き換えられます。
EclipseでJavaアプリケーションを開発する方法
#defineディレクティブを使用して、適切な関数コードを定義できます。これらの関数は通常、小さな関数です。
以下に例を示します。
#include #define REC_AREA(length, breadth) (length * breadth) using namespace std; int main() { int length = 20, breadth = 5, area; area = REC_AREA(length, breadth); cout << 'Area of a rectangle is: ' << area; return 0; }出力:
長方形の面積は次のとおりです:100
ここでは、#defineディレクティブを使用して、長さと幅の2つの引数を取り、長方形の面積を計算する関数REC_AREAを定義しました。 main関数では、このマクロを使用し、2つの引数を指定して、長方形の面積を取得します。
#undef
#defineディレクティブで定義されたプログラム内のマクロは、#undefディレクティブを使用して定義が解除されるまで続きます。プログラムが#undefに遭遇すると、その後マクロ(#undefで定義されていない)を使用すると、コンパイルエラーが発生します。
上記のプログラムで、整数宣言の後にステートメント#undef REC_AREAを指定すると、プログラムはコンパイルエラーを発生します。
条件付きコンパイルディレクティブ
上で説明したディレクティブとは別に、C ++は、コードの条件付きコンパイルに使用できる次のディレクティブも提供します。これらのディレクティブは、C ++のif-elseステートメントの同様の行で使用できます。
例えば、 これらの条件付きディレクティブを使用して、プログラムのDEBUGをONまたはOFFに設定できます。
C ++で提供される条件付きコンパイルディレクティブには次のものがあります。
- #if
- #elif
- #endif
- #ifdef
- #ifndef
- #そうしないと
以下のプログラムは、C ++プログラムでの条件付きコンパイルディレクティブの使用法を示しています。
#include using namespace std; #define DEBUG #define MAX(a,b) (((a)>(b)) ? a : b) int main () { int i, j; i = 100; j = 50; #ifdef DEBUG cout <<'Trace: Start of main function' << endl; #endif cout <<'The maximum is ' << MAX(i, j) << endl; #undef MAX //cout <<'The maximum is ' << MAX(10,20) << endl; #ifdef DEBUG cout <<'Trace: End of main function' << endl; #endif return 0; }出力:
トレース:主な機能の開始
最大は100です
トレース:メイン機能の終了
上記のプログラムでは、#ifdef – #endifディレクティブを使用して、プログラムのDEBUGを定義します。次に、#undefディレクティブを使用してマクロ関数MAXを未定義にしました。条件付きコンパイルディレクティブは、#ifdef – #endifを構成し、DEBUGが設定されているかどうかを確認し、設定されている場合は、プログラムにいくつかのメッセージを出力します。
#&##演算子
#演算子と##演算子は、テキストトークンを表示する文字列に変換し、2つのトークンを連結するためにそれぞれ使用される2つの特別な演算子です。
以下に、これら両方の演算子を示す例を示します。
#include using namespace std; #define MKSTR( x ) #x #define concat(a, b) a ## b int main () { cout <<'MKSTR(Hello World) = '<< MKSTR(Hello World) << endl; int xy = 100; cout <<'concat(x,y) = '< 出力:
MKSTR(Hello World)= Hello World
concat(x、y)= 100
上記のプログラムでは、引数xを使用してMKSTRを定義します。本体は#xです。引数「HelloWorld」を使用してこのMKSTRを出力すると、#xのために、引数が文字列に変換されて出力に表示されることがわかります。
次に、2つの引数aとbを使用してconcat関数を定義しました。本文では、a ## bを指定します。式a ## bはabと同じです。したがって、concat(x、y)を呼び出すときのメイン関数では、実際には、定義した整数変数に等しいxyに評価されます。
Javaでオブジェクトの配列を初期化する方法
その他の指令
#エラー
#errorディレクティブの一般的な構文は次のとおりです。
#error error_message コンパイラが#errorディレクティブを検出すると、error_messageが表示され、コンパイルが停止します。引数error_messageには、引用符付きまたは引用符なしの1つ以上の単語を含めることができます。
#ライン
これにより、コンパイラは、コンパイラの内部に保存されている行番号とファイル名を、指定された行番号とファイル名に変更するように指示されます。
#ライン 数字列(“ファイル名”)
Digit_sequenceは整数定数にすることができます。
例:#line 200 test.c
上記の例では、内部に保存されている行番号が200に設定され、ファイル名がtest.cに変更されています。
#pragma
実装定義の命令をコンパイラに提供します。これらの命令は、コンパイラーとプラットフォームに固有です。命令が一致しない場合、構文エラーを生成せずにディレクティブは無視されます。
事前定義されたマクロ
C ++は、プログラマーが使用できる多数の定義済みマクロも定義します。
これらのマクロのいくつかを以下に表にまとめます。
事前定義されたマクロ 説明 __ファイル__ コンパイル中のプログラムの現在のファイル名 __日付__ 月/日/年の形式でソースコードをオブジェクトコードに変換した日付 __時間__ プログラムがコンパイルされる時間:分:秒の形式の時間 __ライン__ コンパイルされているプログラムの現在の行番号 __cplusplus コンパイラのバージョンごとに定義されている整数定数
次のプログラムは、プログラム内のこれらのマクロを示しています。
#include using namespace std; int main () { cout<<'__LINE__ :' << __LINE__ << endl; cout<<'__FILE__ :' << __FILE__ << endl; cout<<'__DATE__ :' << __DATE__ << endl; cout<<'__TIME__ :' << __TIME__ << endl; cout<<'__cplusplus:'<<__cplusplus< 出力:
__LINE __:5
__FILE __:prog.cpp
__DATE __:2019年4月15日
__TIME __:12:09:15
__cplusplus:201402
上記のプログラム出力は、上記の事前定義されたマクロの説明と一致しており、自明です。
結論
このチュートリアルでは、C ++によって提供されるさまざまなプリプロセッサディレクティブとその例を見てきました。プリプロセッサディレクティブは、より効率的なプログラムとより読みやすいプログラムをある程度作成するのに役立ちます。
条件付きコンパイルディレクティブを使用すると、プログラム出力をさまざまな方法で分岐することもできます。
=> ここでC ++トレーニングシリーズ全体を探してください。
推奨読書
- ソフトウェアテストはアフィリエイトプログラムを助けます!
- 書き込みと獲得-経験豊富なQAテスターのためのプログラム
- Unixパイプチュートリアル:Unixプログラミングのパイプ
- C ++のライブラリ関数
- 無料でC ++プログラミングを学ぶための70以上の最高のC ++チュートリアル
- C ++でのコマンドライン引数
- STLのイテレータ
- C ++の初期化子リスト