3

The macro #define MAX 80 is equivalent to const int MAX = 80; Both are constant and cannot be modified.

Isn't it better to use the macro instead of the constant integer? The constant integer takes memory. The macro's name is replaced by its value by the pre-processor, right? So it wouldn't take memory.

Why would I use const int rather than the macro?

4

4 に答える 4

4

実際にはいくつかの理由があります。

  • スコープ: マクロのスコープを定義することはできません。それはグローバルスコープ、ピリオドで存在します。したがって、クラス固有の定数を持つことはできません、プライベート定数などを持つことはできません。また、マクロの同じ名前で何かを宣言することになると、名前の衝突が発生する可能性があります。存在することを知っています(feを含めた一部のlib /ヘッダーに)

  • デバッグ: プリプロセッサはマクロのインスタンスをその値に置き換えるだけなので、特定の値 (または予期しない特定の動作) でエラーが発生した理由を理解するのが難しくなる可能性があります。この値がどこから来たのか覚えておく必要があります。再利用可能なコードの場合はさらに重要です。自分が書いていないヘッダーで値がマクロとして定義されている場合、値がどこから来ているのかさえ理解できないためです (したがって、これは自分でやる)

  • アドレス: const 変数は、まあ、変数です。これは特に、(const ポインターまたは const 参照が必要な場合) アドレスを渡すことができることを意味しますが、マクロではできません。

  • 型の安全性: const 変数には型を指定できますが、マクロには指定できません。

原則として、(私の意見では)#define明確な代替手段 (const 変数、列挙型、インライン) がある場合はディレクティブを避けるべきだと思います。

于 2013-06-17T13:41:48.223 に答える
3

問題は、それらが同じではないということです。マクロはプリプロセッサによる単なるテキスト置換constですが、 は通常の変数です。

誰かがMAX関数 ( など) 内でシャドーしようとすると、 がマクロのconst in MAX = 32;ときに非常に奇妙なエラー メッセージが表示されます。MAX

C++ では、言語の慣用的なアプローチは、マクロではなく定数を使用することです。数バイトのメモリを節約しようとしても (たとえ節約できたとしても)、可読性を犠牲にする価値はないようです。

于 2013-06-17T13:39:02.680 に答える
2

1)デバッグは私にとって主なものです。デバッガーがMAX実行時に値を解決するのは困難ですが、const intバージョンを使用すると解決できます。

2) #define で型情​​報を取得しません。テンプレートベースの関数を使用している場合。std::max他のデータムがどこにあるかを言うとconst int、マクロバージョンは失敗しますが、const intバージョンは失敗しません。これを回避するには、#define MAX 80Uwhich を使用する必要があります。

3) #define でスコープを制御することはできません。#define ステートメントに続くコンパイル単位全体に適用されます。

于 2013-06-17T13:34:47.757 に答える