次の違いがわかりません:
#define WIDTH 10
と
int width = 10;
最初または2番目を使用する利点は何ですか?
まあ、大きな違いがあります。の値を変更したり、width
アドレスを取得したり、サイズを尋ねたりすることができます。では、どこでもWIDTH
定数に置き換えられるだけ10
なので、式++WIDTH
は意味をなしません。一方、項目を含む配列を宣言することはWIDTH
できますが、項目を含む配列を宣言することはできませんwidth
。
要約すると、 の値はWIDTH
コンパイル時に認識され、変更できません。コンパイラは にメモリを割り当てませんWIDTH
。逆に、は初期width
値 10の変数であり、それ以降の値はコンパイル時には不明です。変数はコンパイラからメモリを取得します。
What is the difference between two?
The first is an Macro while second is an Variable declaration.
#define WIDTH 10
is a preprocessor directive that allows you to specify a name(WIDTH
) and its replacement text(10
). The preprocessor parses the source file and each occurrence of the name is replaced by its associated text. The compiler never actually sees a macro name at all, what it sees is the replaced text.
The variable declaration is evaluated by the compiler itself. It tells the compiler to declare a variable named width
and of the type int
and also initializes it with a value 10
.
The compiler knows this variable by its own name width
.
Which one should you prefer? And Why?
Usually, it is recommended to use compile time constant variables over #define
.
So Your variable declaration should be:
const int width = 10;
There are a number of reasons for selecting compile time constants over #define
, namely:
Scope Based Mechanism:
The scope of #define
is limited to the file in which it is defined. So, #defines
which are created in one source file are NOT available in a different source file. In short, #define
s don't respect scopes.Note that const
variables can be scoped.They obey all scoping rules.
Avoiding Weird magical numbers during compilation errors:
If you are using #define
those are replaced by the pre-processor at time of precompilation So if you receive an error during compilation, it will be confusing because the error message wont refer the macro name but the value and it will appear a sudden value, and one would waste lot of time tracking it down in code.
Ease of Debugging:
Also for same reasons mentioned in #2, while debugging #define
would provide no help really.
WIDTH
はプリプロセッサによって値 (10) に置き換えられるマクロですが、width
は変数です。
マクロ (ここでは WIDTH など) を #define すると、プログラムがコンパイラに渡される前に、プリプロセッサは単純にテキスト置換を行います。つまり、コードで使用した場所はどこでもWIDTH
、単純に に置き換えられます10
。
しかし、そうするとint width=10
、変数は生きています
1 つはプリプロセッサによって処理されます。ソース コードで が#define
見つかり、それを に置き換えます。基本的な置換だけが行われます。もう 1 つはコンパイラによって処理されます。これにより、ルックアップ テーブルにエントリが作成され、バイナリが生成されます。定義されている場所に応じて、スタックに十分なメモリを割り当て、値 10 をそのメモリ位置にコピーします。WIDTH
10
int width = 10;
したがって、1 つは定数のラベルにすぎず、もう 1 つは実行時の変数です。
変数をスタックに割り当てる必要があるため、実行時に変更できないという犠牲を払って、プリプロセッサを使用して実行を高速化できます。
通常、実行時に変更する必要のないものにはプリプロセッサを使用しますが、プリプロセッサは、コンパイラに渡される前にソースコードを実際に操作できるため、デバッグが少し難しい場合があることに注意してください。これにより、非常に微妙なバグが発生します。 、ソース コードを調べると明らかな場合とそうでない場合があります。
定義は、静的なグローバル定義スコープのようなものです。通常の変数として変更または上書きすることはできません。
First a short background: before getting compiled, a C
file is pre-processed. The pre-processor checks for #include
and #define
statements.
In your case, that #define
statement tells the pre-processor to change every string WIDTH
in your source code with the string 10
. When the file gets compiled in the next step, every occurance of WIDTH
will be in fact 10
. Now, the difference between
#define WIDTH 10
and
int width = 10;
is that the first one can be seen as a constant
value, whereas the second is a normal variable whose value can be changed.