工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> C言語

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言語

  1. C# プリプロセッサ ディレクティブ
  2. C++ データ型
  3. C++ 演算子
  4. C++ コメント
  5. C++ コンストラクター
  6. C++ クラス テンプレート
  7. C - プリプロセッサ
  8. C++ の概要
  9. C++ 定数/リテラル
  10. C++ の演算子
  11. C++ の数値