【プログラミングベース】constと#defineの違い
5082 ワード
【前言】
他の人のコードを見たときに出会ったことがあると思います.#defineで定義する人もいれば、constで定義する人もいます.
では、両者の違いはいったい何なのでしょうか.どちらが使いやすいですか.
ネットで調べたり調べたりして、まとめてみます.
【まとめ】コンパイラの処理方式が異なる #defineマクロは前処理段階で展開
const定数はコンパイル実行フェーズで使用タイプとセキュリティチェックが異なる #defineマクロにはタイプがなく、タイプチェックもせず、展開のみ
const定数には特定のタイプがあり、コンパイルフェーズでタイプチェックが実行されます.記憶方式が異なる #defineマクロは展開するだけで、どこで使うか、何度展開してもメモリは割り当てられません
const定数はメモリに割り当てられます(スタック内でもスタック内でも構いません) constは、不要なメモリ割り当てを回避するためにスペースを節約します.例: #define PI 3.14159//定数マクロconst doulbe Pi=3.14159;このときPiをROMに入れていない… double i=Pi;//この時点でPiにメモリを割り当て、以降は割り当てません! double I=PI;//コンパイル中にマクロ置換を行い、メモリdouble j=Piを割り当てる//メモリ割り当てdouble J=PI;//マクロの置き換えを行い、メモリを再割り当てします.const定義定数はアセンブリの観点から、#defineのように即時数ではなく、対応するメモリアドレスが与えられるだけであるため、const定義定数はプログラム実行中にコピーが1部しかなく、#define定義定数はメモリにいくつかのコピーがある. constにより効率が向上 コンパイラは通常、通常のconst定数にストレージスペースを割り当てるのではなく、シンボルテーブルに保存します.これにより、コンパイル中の定数となり、ストレージとリードメモリの操作がなくなり、効率が向上します. constのdefineよりの利点 const定数にはデータ型があり、マクロ定数にはデータ型がありません.コンパイラは、前者のタイプのセキュリティチェックを行うことができます.一方、後者は文字置換のみを行い、タイプセキュリティチェックがないため、文字置換で予想外のエラー(境界効果) が発生する可能性がある.統合デバッグツールによってはconst定数をデバッグできますが、マクロ定数をデバッグできません.
C++においてプログラムはマクロ定数を使用するのではなくconst定数のみを使用する、すなわちconst定数はマクロ定数 に完全に取って代わる.ある定数が他の定数と密接に関連する場合、この関係は定義に含まれるべきであり、いくつかの孤立した値 を与えるべきではない.クラス宣言でconstデータメンバー を初期化することはできません. constデータメンバーの初期化はクラス構築関数の初期化テーブルでのみ を行う.は、クラス全体にわたって一定の定数 を列挙定数で実現する.
これだけにしましょう,深く研究しません
他の人のコードを見たときに出会ったことがあると思います.#defineで定義する人もいれば、constで定義する人もいます.
では、両者の違いはいったい何なのでしょうか.どちらが使いやすいですか.
ネットで調べたり調べたりして、まとめてみます.
【まとめ】
const定数はコンパイル実行フェーズで使用
const定数には特定のタイプがあり、コンパイルフェーズでタイプチェックが実行されます.
const定数はメモリに割り当てられます(スタック内でもスタック内でも構いません)
1 //
2 const float RADIUS = 100;
3 const float DIAMETER = RADIUS * 2;
1 class A{
2 const int SIZE = 100; // const
3 int array[SIZE]; // SIZE
4 }
1 class A{
2 A(int size); //
3 const int SIZE;
4 }
5 A::A(int size) : SIZE(size){ //
6 …
7 }
8 A a(100); // a SIZE 100
9 A b(200); // b SIZE 200
1 class A{
2 …
3 enum { SIZE1 = 100, SIZE2 = 200}; //
4 int array1[SIZE1];
5 int array2[SIZE2];
6 };
7 // , 。
8 // : , , ( PI=3.14159)。
これだけにしましょう,深く研究しません