C++マクロ定義と定数

1777 ワード

前言:ふと思い出すと、かなり前に授業中にC++マクロの定義と定数の違いを聞かれたことがありますが、よく考えてみると、答えられませんでした(気まずい).今回はC++マクロ定数と定数の違いを簡単にまとめてみましょう.
1.マクロ定義
マクロ定義は、C言語で提供される3つの前処理のうちの1つであり、マクロ置換、マクロ置換とも呼ばれ、「マクロ」と略称され、以下のようにdefineで定義される.
#define Pi 3.1415926

マクロ定数にはタイプがありません.これは、コンパイル前のプリコンパイルフェーズで文字を置換する例です.
S = PI * r * r

プリコンパイルフェーズでは、PIを3.1415926に直接置き換え、タイプセキュリティチェックがなく、メモリも割り当てられません.
マクロ定義#undefシンボルを使用してマクロ定義を終了する役割ドメイン.
2.定数
定数は、実行中に値が一定に変化しない識別子です.定数はキーワードconst定義を使用します.次のようにします.
const float PI = 3.14159;

定数は実行時に置き換えられ、コンパイル時に厳格なタイプチェックが行われ、システムにも定数にメモリが割り当てられます.
3.違い
前述したように、C++言語はconstで定数を定義してもよいし、#defineでマクロ定数を定義してもよい.しかし、両者の違いは、
  • const定数にはデータ型があり、マクロ定数にはデータ型がない.
  • const定数は実行時に置き換えられ、マクロ定数はプリコンパイル遮断で置き換えられ、const定数はコンパイル段階でタイプセキュリティチェックが行われ、マクロ定数は行われない.
  • 統合デバッグツールによってはconst定数をデバッグできますが、マクロ定数をデバッグできません.

  • 4.付録
    実際の使用では、マクロ定数はプリコンパイル時に単純な文字置換のみを行うため、コンパイルチェックは行われないため、マクロ定数の使用に特に注意すべきである.例えば、以下のコードである.
    #define N 3 + 2
    
    float a = 2 * N

    予想される値はa=10であるべきであるが、実際の結果はa=8である.これは、マクロ定数Nがプリコンパイル段階で直接文字を置き換え、以下のコードになったためである.
    float a = 2 * 3 + 2

    これはマクロ定義の「エッジ効果」とも呼ばれます.
    また、ルール5−2−1に従って、C++プログラムではマクロ定数のみを使用し、マクロ定数を使用しない.すなわち、const定数はマクロ定数を完全に置換する.