Angenommen, T
ist ein beliebiger Typ und wir sprechen über Objective-C. Was ist dann der Unterschied zwischenUnterschied zwischen statisch T const und statisch const T
static T const x = ....
und
static const T x = ....
?
Angenommen, T
ist ein beliebiger Typ und wir sprechen über Objective-C. Was ist dann der Unterschied zwischenUnterschied zwischen statisch T const und statisch const T
static T const x = ....
und
static const T x = ....
?
Ich glaube, dass die Unterscheidung nur für Zeigertypen wichtig ist; zum Beispiel 'char *'.
const char *p
bedeutet, dass der Puffer von p
spitz nicht aktualisiert werden, sondern Zeiger p
selbst kann (typischerweise inkrementiert mit p ++), beispielsweise geändert werden:
void f(const char *p)
{
while (*p != '\0')
{
putc(*p);
p++;
}
}
char * const p
bedeutet, dass der Puffer spitz um p
kann aktualisiert werden, aber Zeiger kann nicht geändert werden.
EDIT Vielen Dank für JeremyP für den folgenden Kommentar:
Es ist ganz in Apples APIs gemeinsamen String-Konstanten (anstelle der Verwendung #defines), vor allem, wenn die Zeichenfolge ein NSString dh NSString * const kFoo = @"bar";
zu definieren Sie sind gleich.
Ein wenig Hintergrund über const
:
Objective-C, wie C, verwendet die Clockwise/Spiral Rule. In einem Fall, wo haben Sie nur Modifikatoren auf der linken Seite der Variablen (von foo) Sie lesen Material von rechts nach links:
int * const * var;
gelesen wird: var ein Zeiger auf einen konstanten Zeiger ist auf ganzzahlige .
jedoch const
hat die gleiche Wirkung, wenn es vor oder nach dem ersten Typ ist:
int const var; // constant integer
const int var; // constant integer, same as above
static
stattdessen wirkt sich auf die ganze Variable: es ist die Variable statisch zu sein, nicht das Element zeigte durch es oder irgendetwas anderes: ein Zeiger auf eine Ganzzahl kann sowohl zum Zeigen auf eine statische Ganzzahl als auch auf eine automatische Ganzzahl ohne Unterschied verwendet werden, und C bietet keine Syntax zum Deklarieren eines Zeigers, der auf statische Variablen zeigen kann (oder auf automatisch) Variablen).
static int * x; // x is a static pointer to integer
int static * y; // as above y is a static pointer to integer
int * static z; // THIS SYNTAX IS NOT ALLOWED
// but if it was, it would mean the same thing
Aus diesem Grund ziehe ich es vor jedem const
Modifikator zu platzieren, aber es spielt keine Rolle, eigentlich.
static const int * const * x; // this is what I do
Das ist eine wunderbare Erklärung von Peoro. Darüber hinaus möchte ich hinzufügen, dass der statische Bereich den Bereich auf den Aufruf (in Objective-C) der Datei begrenzt, in der er aufgerufen wird. Ich würde gerne wissen, was es bedeutet, statisch und konstant miteinander zu kombinieren etwas statisch erklären? Wenn es dir nichts ausmacht, in die Tiefe zu gehen. Ich habe einen guten Referenzlink, der hier mehr erklärt: http://www.numbergrinder.com/2008/12/static-constant-strings-in-objective-c/ – TheCodingArt
Wenn Sie einen globalen Const-Zeiger deklarieren, fängt er falsche Versuche ab, diesen zu ändern. –
Einverstanden!Ich habe das aber noch nie gesehen :) – trojanfoe
Es ist ziemlich üblich in Apples APIs, String-Konstanten zu definieren (anstatt #defines zu verwenden), besonders wenn der String ein NSString ist, dh 'NSString * kFoo const = @" bar ";' – JeremyP