#define
in C bewirkt eine Textersetzung. Zum Beispiel:
Nun ist der Umfang von #define
viel größer als das; es ist nicht nur auf Variablen beschränkt (und es gibt in Java nicht direkt etwas Ähnliches). Wenn Sie eine static
-Variable haben, gibt es keine Garantie, dass sich diese Variable nicht ändert, sodass eine ähnliche "textuelle Unterstation" nicht erstellt werden kann. Allerdings , wenn Sie eine Variable static final
deklarieren und sie einem Kompilierzeitkonstante , da ist eine solche Garantie. Also:
Ähnlich wie bei #define
werden statische Endkonstanten zur Kompilierzeit durch ihre tatsächlichen Werte ersetzt. In diesem Sinne sind statische Endkonstanten ähnlich wie #define
Konstanten.
statisch , nein.
final , ja.
%Vor% Eine final
Variable kann nur einmal initialisiert werden.
static
Variablen gehören zur Klasse und nicht zu einer Instanz.
JEDOCH
Sie können in der Funktion ähnlich sein, aber die Art und Weise, wie das funktioniert, ist völlig anders.
Eine letzte Variable ist immer noch nur eine Variable. A #define
in C (++), wird tatsächlich bei Build interpretiert und modifiziert die Binärausgabe entsprechend, was bewirkt, dass die Variablen zur Laufzeit Konstanten sind.
#define
ist effizienter.
#define
ist eine Präprozessordirektive - der Wert, den Sie definieren, wird vor der Kompilierung an die Stelle im Code getauscht, an der er angegeben wurde. Es gibt eine Reihe von Fallstricken - Wie jede globale Variable kann es unter anderem mit einer ähnlich benannten Variablen in Konflikt kommen.
Wenn Sie eine Konstante wünschen, verwenden Sie stattdessen const
.
Der erste Ratschlag von C nach C ++ lautet: "Verwenden Sie nicht #define", versuchen Sie stattdessen, eine konstante Variable zu verwenden. '#define' ist schwer zu debuggen.
Der große Vorteil der Java final int LOWER=0;
-Definition ist, dass LOWER immer eine Variable bleibt und für den Debugger als solche sichtbar ist.
In C wird der definierte Wert durch den Precompiler im Code ersetzt und der Konstantenname ist weg.
in #define lower 0
low ist keine Variable. Zur Kompilierzeit wird lower
durch 0
ersetzt, wo immer es in einem ganzen Code verwendet wird.
wobei static int lower = 0;
eine Variable definiert und die tatsächliche Speicherreferenz zur Laufzeit ausgeführt wird, um auf den Wert einer Variablen zuzugreifen. Plus-Wert davon kann in Ihrem Code geändert werden.
Um Änderungen zu vermeiden, können Sie es wie folgt definieren static final int lower = 0;
Compiler machen jetzt einige Tage ziemlich gute Arbeit in der Optimierung. Zur Kompilierzeit wird nur dieser lower
durch 0
ersetzt.
Sie können also nur "sagen", dass #define lower 0
in C äquivalent zu static final int lower = 0;
ist. Aber sie sind nicht gleich. Weil der spätere während der Optimierungsphase ersetzt wurde. Wenn die Optimierung deaktiviert ist, wird sie bei der Kompilierung nicht ersetzt.
Ich hoffe, das hilft.
Der Define Preprocessor eignet sich hervorragend zum Benennen von Konstanten, bietet aber nicht den gleichen Typ, der eine Java (oder C ++) Konstanten-Deklaration erlaubt. Da ich viele Jahre C- und C ++ - Entwickler war, mag ich die Typüberprüfung, die C ++ (und Java) bietet. Erinnert an Design nach Vertrag usw.
Aber auch die Flexibilität von Sprachen wie Perl, Python und Ruby, die "Duck-Typisierung" bieten, und ein weniger rigoroser Ansatz für Typdeklarationen sind ebenfalls von Vorteil. Die philosophische Disziplin, die eine strenge Typprüfung bietet, hat ihren Wert. Aber wenn Sie nur versuchen, eine (benannte) const (ant) zu deklarieren, scheint die ganze Strenge übertrieben zu sein.
Also, ja, ein #define ist eine Möglichkeit, um 'konstant' zu buchstabieren.
%Vor%Aber lesen Sie, wie schwer es wirklich ist, eine Variable in Python konstant zu machen. Ссылка