C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++プリプロセッサ


プリプロセッサは、実際のコンパイルが開始される前に情報を前処理するようにコンパイラに指示するディレクティブです。

pすべてのプリプロセッサディレクティブは#で始まり、行のプリプロセッサディレクティブの前に空白文字のみを表示できます。プリプロセッサディレクティブはC++ステートメントではないため、セミコロン(;)で終了しません。

すべての例で#includeディレクティブを見てきました。このマクロは、ヘッダーファイルをソースファイルにインクルードするために使用されます。

C ++でサポートされているプリプロセッサディレクティブには、#include、#define、#if、#else、#lineなどがあります。重要なディレクティブを見てみましょう-

#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;
}

出力

Value of PI :3.14159

条件付きコンパイル

プログラムのソースコードの選択部分をコンパイルするために使用できるいくつかのディレクティブがあります。このプロセスは条件付きコンパイルと呼ばれます。

条件付きプリプロセッサ構造は、「if」選択構造によく似ています。次のプリプロセッサコードを検討してください-

#ifndef NULL
   #define NULL 0
#endif

デバッグ目的でプログラムをコンパイルできます。次のように、単一のマクロを使用してデバッグをオンまたはオフにすることもできます-

#ifdef DEBUG
cerr <<"Variable x = " << x << endl;
#endif

これにより、ディレクティブ#ifdef DEBUGの前にシンボリック定数DEBUGが定義されている場合、cerrステートメントがプログラムでコンパイルされます。次のように、#if0ステートメントを使用してプログラムの一部をコメントアウトできます-

#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;
}

出力

Trace: Inside main function
The minimum is 30
Trace: Coming out of main function

  1. C ++の#defineとconstキーワードの違いは何ですか?

    #defineディレクティブはプリプロセッサディレクティブです。プリプロセッサは、コンパイラがマクロを認識する前に、これらのマクロを本体に置き換えます。これは、ソースコードの自動検索と置換と考えてください。 const変数宣言は、言語で実際の変数を宣言します。これは、実際の変数のように使用できます。アドレスを取得し、渡し、キャストし、変換します。 コンパイラの最適化がないと、さまざまなケースでこれらの両方に関連するメモリ割り当ての隠れたコストが発生します。しかし、適切に最適化すれば、それらはほぼ同じになります。また、プリプロセッサマクロにはスコープがありませんが、const値にはスコープがあ

  2. C ++の#defineプリプロセッサとは何ですか?

    #defineは、識別子またはパラメータ化された識別子とトークン文字列の関連付けであるマクロを作成します。マクロが定義された後、コンパイラーは、ソースファイル内の識別子の出現ごとにトークン文字列を置き換えることができます。 #define identifier token-string これがプリプロセッサの使用方法です。 #defineディレクティブを使用すると、コンパイラは、ソースファイル内で出現する識別子ごとにtoken-stringを置き換えます。識別子は、トークンを形成する場合にのみ置き換えられます。つまり、識別子がコメント、文字列、またはより長い識別子の一部として表示されている場合