Beim Durchsuchen von Quellcode bin ich auf eine Funktion wie diese gestoßen:
void someFunction(char someArray[static 100])
{
// do something cool here
}
Mit etwas Experimentieren scheint es, dass dort auch andere Qualifizierer erscheinen können:
void someFunction(char someArray[const])
{
// do something cool here
}
Es scheint, dass Qualifizierer nur innerhalb von erlaubt sind [
]
wenn das Array als Parameter einer Funktion deklariert wird. Was machen diese? Warum ist das bei Funktionsparametern anders?
Die erste Deklaration teilt dem Compiler das mit someArray
ist wenigstens 100 Elemente lang. Dies kann für Optimierungen genutzt werden. Das heißt zum Beispiel auch someArray
ist niemals NULL
.
Beachten Sie, dass der C-Standard nicht verlangt, dass der Compiler diagnostiziert, wenn ein Aufruf der Funktion diese Anforderungen nicht erfüllt (dh es handelt sich um ein stilles, undefiniertes Verhalten).
Die zweite Deklaration erklärt einfach someArray
(nicht someArray
‘s-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 ist nur innerhalb des innersten verwendbar []
eines Array-Deklarators in einer Funktionsparameterliste; es würde in anderen Kontexten keinen Sinn machen.
Der Standardtext, der beide oben genannten Fälle abdeckt, ist in C11 6.7.6.3/7 (war 6.7.5.3/7 in C99):
Eine Deklaration eines Parameters als „array of type“ muss auf „qualifizierter Zeiger auf Typ“ angepasst werden, wobei die Typqualifizierer (falls vorhanden) diejenigen sind, die innerhalb von angegeben sind [
and ]
der Array-Typ-Ableitung. Wenn das Schlüsselwort static auch innerhalb der [
and ]
der Array-Typ-Ableitung, dann muss für jeden Aufruf der Funktion der Wert des entsprechenden tatsächlichen Arguments den Zugriff auf das erste Element eines Arrays mit mindestens so vielen Elementen ermöglichen, wie durch den Größenausdruck angegeben.