9

次の違いがわかりません:

#define WIDTH 10 

int width = 10;

最初または2番目を使用する利点は何ですか?

4

6 に答える 6

11

まあ、大きな違いがあります。の値を変更したり、widthアドレスを取得したり、サイズを尋ねたりすることができます。では、どこでもWIDTH定数に置き換えられるだけ10なので、式++WIDTHは意味をなしません。一方、項目を含む配列を宣言することはWIDTHできますが、項目を含む配列を宣言することはできませんwidth

要約すると、 の値はWIDTHコンパイル時に認識され、変更できません。コンパイラは にメモリを割り当てませんWIDTH。逆に、は初期width値 10の変数であり、それ以降の値はコンパイル時には不明です。変数はコンパイラからメモリを取得します。

于 2012-06-18T08:47:42.950 に答える
8

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, #defines 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.

于 2012-06-18T08:50:08.380 に答える
2

WIDTHはプリプロセッサによって値 (10) に置き換えられるマクロですが、widthは変数です。

マクロ (ここでは WIDTH など) を #define すると、プログラムがコンパイラに渡される前に、プリプロセッサは単純にテキスト置換を行います。つまり、コードで使用した場所はどこでもWIDTH、単純に に置き換えられます10

しかし、そうするとint width=10、変数は生きています

于 2012-06-18T08:45:27.867 に答える
0

1 つはプリプロセッサによって処理されます。ソース コードで が#define見つかり、それを に置き換えます。基本的な置換だけが行われます。もう 1 つはコンパイラによって処理されます。これにより、ルックアップ テーブルにエントリが作成され、バイナリが生成されます。定義されている場所に応じて、スタックに十分なメモリを割り当て、値 10 をそのメモリ位置にコピーします。WIDTH10int width = 10;

したがって、1 つは定数のラベルにすぎず、もう 1 つは実行時の変数です。

変数をスタックに割り当てる必要があるため、実行時に変更できないという犠牲を払って、プリプロセッサを使用して実行を高速化できます。

通常、実行時に変更する必要のないものにはプリプロセッサを使用しますが、プリプロセッサは、コンパイラに渡される前にソースコードを実際に操作できるため、デバッグが少し難しい場合があることに注意してください。これにより、非常に微妙なバグが発生します。 、ソース コードを調べると明らかな場合とそうでない場合があります。

于 2012-06-18T08:51:14.870 に答える
0

定義は、静的なグローバル定義スコープのようなものです。通常の変数として変更または上書きすることはできません。

于 2018-07-27T06:44:41.040 に答える
0

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.

于 2012-06-18T08:49:32.653 に答える