Die erste Erklärung weist den Compiler an, die someArray
ist mindestens 100 Elemente lang. Dies kann für Optimierungen verwendet werden. Zum Beispiel bedeutet es auch, dass dies someArray
niemals der Fall ist NULL
.
Beachten Sie, dass der C-Standard vom Compiler keine Diagnose verlangt, wenn ein Aufruf der Funktion diese Anforderungen nicht erfüllt (dh es handelt sich um ein stilles undefiniertes Verhalten).
Die zweite Deklaration deklariert einfach someArray
(nicht someArray
die Elemente!) Als const, dh Sie können nicht schreiben someArray=someOtherArray
. Es ist dasselbe, als ob der Parameter wäre char * const someArray
.
Diese Syntax kann nur im Innersten verwendet werden []
eines Array-Deklarators in einer Funktionsparameterliste verwendet werden. In anderen Zusammenhängen wäre dies nicht sinnvoll.
Der Standardtext, der beide oben genannten Fälle abdeckt, befindet sich in C11 6.7.6.3/7 (war 6.7.5.3/7 in C99):
Eine Deklaration eines Parameters als '' Array vom Typ '' wird an '' qualifizierter Zeiger auf Typ '' angepasst, wobei die Typqualifizierer (falls vorhanden) diejenigen sind, die in der [
und ]
der Array-Typableitung angegeben sind. Wenn das Schlüsselwort static auch innerhalb der Ableitung [
und ]
des Array-Typs erscheint , muss der Wert des entsprechenden tatsächlichen Arguments für jeden Aufruf der Funktion den Zugriff auf das erste Element eines Arrays mit mindestens so vielen Elementen ermöglichen, wie durch das angegeben Größenausdruck.
int foo(struct bar [static 1]);
stattint foo(struct bar *);
als Signatur für Funktionen zu verwenden, die keine NULL-Zeiger akzeptieren. (Ich weiß, dass gcc eine alternative, nicht standardmäßige Syntax hat, um solche Funktionen zuclang
jetzt warnt korrekt, wenn Sie versuchen, ein bekanntes NULL-Argument an eine Funktion mit einer[static 1]
Parameterdeklaration zu übergeben.if (!someArray) { somecode... }
könnte entfernt werden