C++のマクロ定義の学習

2939 ワード

1、マクロ定義の概要
主に#if、#ifndef、#endif、#includeなどがあります.ここで、#defineコマンドは、1つの識別子(マクロ名)を1つの文字列(置換テキスト)として定義し、プリコンパイル時に程勲に現れる識別子を文字列に置換するためによく使用されます(残りのいくつかは比較的簡単です).
#defineコマンドには、単純なマクロ定義とパラメータ付きマクロ定義の2つのフォーマットがあります.
//#define <  > <   >
#define PI 3.1415926
//#define <  > (<   >) <  >
#define A(x) x*x

2、マクロ定義の発生タイミング
defineの役割を本当に理解するために、C言語ソースプログラムの処理手順を理解してみましょう.Turbo Cのような統合された開発環境で作成されたソースプログラムをコンパイルすると、実際には、前処理、コンパイル、アセンブリ、接続のいくつかのプロセスが行われます.プリプロセッサは、次の機能を実現するコンパイラの出力を生成します.
(1)ファイルには、ソースプログラムのincludeをファイル本文に拡張することができる.hファイルを見つけてincludeの場所に広げることができる.(2)条件コンパイルプリプロセッサは、#ifや#ifdefなどのコンパイルコマンドとその後の条件に基づいて、ソースプログラムの一部を含めたり除外したりし、通常は除外された文を空行に変換する.(3)マクロ展開プリプロセッサは、ソースプログラムファイルに現れるマクロへの参照を対応するマクロ定義に展開する.すなわち、本明細書でいう「define」の機能は、プリプロセッサによって達成される.プリプロセッサ処理されたソースプログラムは、以前のソースプログラムとはすべて異なり、この段階で行われる作業は純粋な置換と展開にすぎず、計算機能は一切ないしたがって,defineコマンドを学習する際にこれを真に理解すれば,このコマンドに誤解や誤用を招くことはない.
3マクロ定義の利点
(1)便利なプログラムの修正
単純なマクロ定義を使用して、プログラムでよく使用される定数の代わりに使用可能なマクロを定義します.これにより、定数を変更するときに、プログラム全体を変更することなく、マクロ定義の文字列だけを変更できます.また、定数が長い場合は、短い意味のある識別子でプログラムを書くことができます.これにより、より便利です.私たちが言っている定数の変化はプログラムの実行中に変化するのではなく、プログラミング中の修正であり、よく知られている例を挙げると、円周率πは数学的によく使われる値であり、3.14で表す場合もあり、3.1415926などを使う場合もあります.これは計算に必要な精度を見て、私たちが作成したプログラムの中で何度もそれを使用する場合、では、1つの数値を決定する必要があります.今回の実行では変更されませんが、後でプログラムが表現する精度が変化していることがわかり、その値を変更する必要があります.これはプログラム内のすべての関連数値を修正する必要があります.これは私たちに一定の不便をもたらしますが、マクロの定義を使用して識別子を使用して置き換えると、修正時にマクロ定義だけを修正すればいいです.3.1415926という長い数値を複数回入力する場合を減らすこともできます.私たちはこのように定義することができます.入力を減らすだけでなく、修正しやすいので、喜んでいませんか.
(2)プログラムの実行効率の向上
パラメータ付きマクロ定義を使用すると、関数呼び出しの機能を完了し、システムのオーバーヘッドを削減し、実行効率を向上させることができます.C言語で述べたように、関数の使用はプログラムをよりモジュール化し、組織しやすく、再利用可能にすることができるが、関数呼び出しが発生した場合、呼び出し関数のフィールドを保持し、サブ関数実行が終了した後に実行を再開できるようにする必要がある.同様に、サブ関数実行が完了した後に呼び出し関数のフィールドを復元するには、一定の時間がかかる.サブ関数が実行する操作が多い場合、この変換時間のオーバーヘッドは無視できますが、サブ関数が完了する機能が少なく、乗算文のような操作が1つしか完了していない場合でも、この変換オーバーヘッドは比較的大きくなりますが、パラメータ付きマクロ定義を使用するとこの問題は発生しません.前処理フェーズでマクロ展開が行われているため、実行時に変換を必要とせず、ローカルで実行されます.マクロ定義は簡単な操作を完了できますが、複雑な操作は関数呼び出しで完了し、マクロ定義が占有するターゲットコード空間は比較的大きいです.したがって、マクロ定義を使用するかどうかは、使用時に状況に応じて決定されます.
4、マクロの例
#define Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x

(1)まずx##yは何を表しますか?x接続yを表します.例えば:
int n = Conn(123,456); //     n=123456;
char* str = Conn("asdf", "adf"); //     str = "asdfadf";

(2)さらに#@xを見ると、xに一重引用符を付けた結果、const charが返されます.例を挙げます.
char a = ToChar(1);//    a='1';

(3)最後に#xを見て、あなたも分かったと思います.彼はxに二重引用符をつけています.
char* str = ToString(123132);//   str="123132";

一般的なマクロ定義
1ヘッダファイルの重複除外
#ifndef BODYDEF_H 
#define BODYDEF_H 
 //      

#endif

2指定されたアドレスのバイトまたはワードを取得
#define MEM_B( x ) ( *( (byte *) (x) ) ) 
#define MEM_W( x ) ( *( (word *) (x) ) )