C++マクロ定義#defineと定数constの違い

1647 ワード

マクロ定義#defineと定数constの違い
タイプとセキュリティチェックが異なります
マクロ定義は文字置換であり、データ型の違いはないが、この置換にはタイプセキュリティチェックがなく、境界効果などのエラーが発生する可能性がある.
const定数は定数の宣言で、タイプの違いがあり、コンパイル段階でタイプチェックを行う必要があります.
コンパイラの処理が異なる
マクロ定義は「コンパイル時」の概念であり、前処理段階で展開され、マクロ定義をデバッグすることができず、ライフサイクルの終了とコンパイル時期である.
const定数は、読み取り専用行データに類似したプログラム実行で使用される「実行時」概念です.
記憶方式が違う
マクロ定義は直接置き換えられ、メモリは割り当てられず、プログラムのコードセグメントに格納されます.
const定数はメモリ割り当てが必要で、プログラムのデータセグメントに格納されます.
ドメインの違いの定義
void f1 ()
{
    #define N 12
    const int n 12;
}
void f2 ()
{
    cout<

定義後にキャンセルできるかどうか
マクロ定義はundefによって前のマクロ定義を無効にすることができる
const定数定義後、定義ドメイン内で永続的に有効になります.
void f1()
{
  #define N 12
  const int n = 12;

  #undef N //      ,   f1   ,N    
  #define N 21//         
}

関数パラメータを作成できるかどうか
マクロ定義はパラメータとして関数に渡すことはできません
const定数は関数のパラメータリストに表示できます
その他の理解:
角度1:定数を定義するとconstで定義される定数は変数もタイプもあり、#defineで定義されるのは定数だけでタイプはありません.
角度2:機能するフェーズでは、#defineはコンパイルの前処理フェーズで機能し、constはコンパイル、実行時に機能します.
角度3:機能する方法では、#defineは単純な文字列置換であり、タイプチェックはありません.constには対応するデータ型があり、判断を行うため、低レベルのエラーを避けることができます.defineは単純な文字列置換だけで境界効果をもたらすため、具体的には次のコードを参照してください.
#define N 2+3     //       N    5,       
Ndouble a = N/2;  //        a     2.5,     a     3.5

角度4:スペースの使用について、次のようにします.
#define PI 3.14     //            
const float PI=3.14;    //         float,       

角度5:コードデバッグの便利さから言えばconst定数はデバッグ可能で、#defineはデバッグできません.プリコンパイル段階で置き換えられているからです.
角度6:再定義できるかどうかの観点から、constが不足している点は、生まれつきのものであり、constは再定義できないが、defineはundefによってある記号の定義をキャンセルし、再定義することができる.