web-dev-qa-db-ja.com

#defineとconstの違いは何ですか?

可能性のある重複:
なぜ誰かが#defineを使用して定数を定義するのですか?
c ++のマクロとconstの違い
C++-enum vs. const vs. #define

定数の作成に#defineconstを使用することの違いは何ですか?他に比べてパフォーマンス上の利点はありますか?当然、constを使用することを好みますが、適切な利点がある場合は#defineを検討します。

40
afaolek

#defineディレクティブはプリプロセッサディレクティブです。プリプロセッサはこれらのマクロを本体で置き換えます(== --- ==)beforeコンパイラはそれを認識します。ソースコードの自動検索および置換と考えてください。

Const変数宣言は、言語で実際の変数を宣言します。実際の変数と同じように、実際の変数と同じように、アドレスを取得したり、渡したり、使用したり、キャスト/変換したりできます。

ああ、パフォーマンス:変数の宣言を避けることで時間とスペースを節約できると思うかもしれませんが、賢明なコンパイラ最適化レベルでは、コンパイル時に定数値が既に置き換えられて折り返されているため、違いはありません。しかし、型チェックとデバッガーにコードを知らせるという大きな利点が得られるため、const変数を使用しない理由は実際にはありません。

75
Kerrek SB

#defineは、マクロプリプロセッサによる置換のためのエンティティを作成します。これは、定義とは定数として扱われるかどうかによって、定数とはまったく異なります。 #defineの内容は任意に複雑になる可能性があり、古典的な例は次のようになります。

#define SQR(x) (x)*(x)

後で使用する場合:

SQR(2+3*4)

それは次のようになります。

(2+3*4)*(2+3*4)
7
zippy

違いは、#defineがプリプロセッサによって処理され、単純なテキスト置換に相当することです。このように定義された定数値は実際のコンパイラーには表示されませんが、const修飾子で定義された変数は実際に型付けされた「変数」です(実際にはその変数ではありません)。 #defineの短所は、名前のすべての出現を置き換えることです。一方、const変数は通常のルックアップを取得するため、名前の競合のリスクが低く、タイプセーフではありません。

#defineの利点は、constnessを保証するため、バッキング変数がないことです。定数変数はコードに置換される場合とされない場合があるため、#defineは状況によっては高速になる場合があります。しかし、優れたコンパイラーはとにかくそれらのconstをインライン化する必要があり、ほとんどの状況で大きな違いを生む可能性は低いので、コンパイラーが変数と非常にパフォーマンスが重要なコードです。

3
Grizzly

#defineはテキストによる置換であるため、可能な限り高速です。さらに、それは安定性を保証します。欠点は、タイプセーフではないことです。

一方、const変数は、コード内でインラインで置換される場合とされない場合があります。 constをメモリに強制的に流し去ることができます(おそらく、それはおそらく読み取り専用メモリに常駐しますが、いずれにしても頭痛の種があります)。ただし、独自のタイプを保持するため、タイプセーフであることが保証されています。

あなたの意図を明確にするために、個人的にconstをお勧めします。

1
Blindy

#define A Bは、プリプロセッサ(コンパイラの一部)に、コード内でBが見られる場合は常にAを使用するよう指示し、コードをコンパイルする前にそれを行います。 (ひどい考えですが)#define FALSE TRUE

Const変数とは、変数がいったん設定されると変更できないことを意味しますが、プリプロセッサでは何も行わず、変数の通常の規則に従います。

0
RC Howe

DEFINEはプリプロセッサ命令です。たとえば、#define x5。コンパイラはこの値を取得し、プログラムでxを呼び出してオブジェクトファイルを生成する場所にinsertを挿入します。定数を定義すると、シンボルテーブルにシンボルエントリが作成されません。プログラムをデバッグする場合、xは見つかりません。可能な限り定数を使用してください。

0
Alok