web-dev-qa-db-ja.com

Cのマクロ定数と定数変数の違いは何ですか?

重複の可能性:
「staticconst」とCの「#define」

私はCを学び始めましたが、マクロと定数変数の違いをはっきりと理解できませんでした。

私が書くと何が変わるか、

#define A 8

そして

const int A = 8

18
erkangur

マクロはプリプロセッサによって処理されます。プリプロセッサはソースファイル内のテキストを置換し、出現するすべての「A」をリテラル8に置き換えます。

定数はコンパイラーによって処理されます。それらには、型安全性という追加の利点があります。

実際にコンパイルされたコードの場合、最新のコンパイラでは、2つの間にパフォーマンスの違いはありません。

27
Michael

マクロ定義の定数は、プリプロセッサに置き換えられます。定数「変数」は、通常の変数と同じように管理されます。

たとえば、次のコード:

#define A 8
int b = A + 10;

実際のコンパイラには次のように表示されます

int b = 8 + 10;

ただし、このコード:

const int A = 8;
int b = A + 10;

次のように表示されます:

const int A = 8;
int b = A + 10;

:)

実際には、変更される主なものはスコープです。定数変数は、Cの標準変数と同じスコープ規則に従います。つまり、特定のブロック内で、リークすることなく制限したり、場合によっては再定義したりできます。これは、ローカル変数に似ています。対グローバル変数の状況。

7
Lucas Jones

Cでは、あなたは書くことができます

#define A 8
int arr[A];

だがしかし:

const int A = 8;
int arr[A];

ルールを正しく思い出せば。 C++では、両方が機能することに注意してください。

4
swegi

一つには、前者はコンパイラが何かをする前にプリプロセッサにAのすべての出現を8に置き換えさせますが、後者はプリプロセッサを含みません

1
µBio