C++マクロ定義と定数
1777 ワード
前言:ふと思い出すと、かなり前に授業中にC++マクロの定義と定数の違いを聞かれたことがありますが、よく考えてみると、答えられませんでした(気まずい).今回はC++マクロ定数と定数の違いを簡単にまとめてみましょう.
1.マクロ定義
マクロ定義は、C言語で提供される3つの前処理のうちの1つであり、マクロ置換、マクロ置換とも呼ばれ、「マクロ」と略称され、以下のようにdefineで定義される.
マクロ定数にはタイプがありません.これは、コンパイル前のプリコンパイルフェーズで文字を置換する例です.
プリコンパイルフェーズでは、PIを3.1415926に直接置き換え、タイプセキュリティチェックがなく、メモリも割り当てられません.
マクロ定義#undefシンボルを使用してマクロ定義を終了する役割ドメイン.
2.定数
定数は、実行中に値が一定に変化しない識別子です.定数はキーワードconst定義を使用します.次のようにします.
定数は実行時に置き換えられ、コンパイル時に厳格なタイプチェックが行われ、システムにも定数にメモリが割り当てられます.
3.違い
前述したように、C++言語はconstで定数を定義してもよいし、#defineでマクロ定数を定義してもよい.しかし、両者の違いは、 const定数にはデータ型があり、マクロ定数にはデータ型がない. const定数は実行時に置き換えられ、マクロ定数はプリコンパイル遮断で置き換えられ、const定数はコンパイル段階でタイプセキュリティチェックが行われ、マクロ定数は行われない. 統合デバッグツールによってはconst定数をデバッグできますが、マクロ定数をデバッグできません.
4.付録
実際の使用では、マクロ定数はプリコンパイル時に単純な文字置換のみを行うため、コンパイルチェックは行われないため、マクロ定数の使用に特に注意すべきである.例えば、以下のコードである.
予想される値はa=10であるべきであるが、実際の結果はa=8である.これは、マクロ定数Nがプリコンパイル段階で直接文字を置き換え、以下のコードになったためである.
これはマクロ定義の「エッジ効果」とも呼ばれます.
また、ルール5−2−1に従って、C++プログラムではマクロ定数のみを使用し、マクロ定数を使用しない.すなわち、const定数はマクロ定数を完全に置換する.
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でマクロ定数を定義してもよい.しかし、両者の違いは、
4.付録
実際の使用では、マクロ定数はプリコンパイル時に単純な文字置換のみを行うため、コンパイルチェックは行われないため、マクロ定数の使用に特に注意すべきである.例えば、以下のコードである.
#define N 3 + 2
float a = 2 * N
予想される値はa=10であるべきであるが、実際の結果はa=8である.これは、マクロ定数Nがプリコンパイル段階で直接文字を置き換え、以下のコードになったためである.
float a = 2 * 3 + 2
これはマクロ定義の「エッジ効果」とも呼ばれます.
また、ルール5−2−1に従って、C++プログラムではマクロ定数のみを使用し、マクロ定数を使用しない.すなわち、const定数はマクロ定数を完全に置換する.