Was ist der Zweck des statischen Schlüsselworts im Array-Parameter einer Funktion wie “char s[static 10]”?

Lesezeit: 3 Minuten

Benutzeravatar von dreamlax
Traumlax

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?

Benutzeravatar von Nordic Mainframe
Nordischer Großrechner

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.

  • Zu diesem Thema: Ich frage mich, ob es vorzuziehen ist, es zu verwenden int foo(struct bar [static 1]); Anstatt von int foo(struct bar *); als Signatur für Funktionen, die keine NULL-Zeiger akzeptieren. (Ich weiß, dass gcc eine alternative, nicht standardmäßige Syntax hat, um solche Funktionen zu kennzeichnen, damit der Compiler Warnungen ausgeben kann.)

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    7. August 2010 um 12:24 Uhr

  • Ich habe gerade gcc und clang überprüft und gehe auch nicht davon aus, dass someArray immer nicht null ist, wenn ich sie auffordere, mit 0 zu vergleichen. Außerdem habe ich Schwierigkeiten, die genaue Klausel in C99 zu finden, die sie definiert. Es gibt einen Hinweis in 6.7.5.3-21, der die beabsichtigte Bedeutung erwähnt, und das war’s. Ich bezweifle, dass wir uns darauf verlassen können. Darüber hinaus ist all dies nicht Teil der Funktionssignatur, daher gibt es nicht viel, was wir dadurch erzwingen.

    – Nordischer Großrechner

    7. August 2010 um 12:42 Uhr

  • Dieser Link scheint verrottet zu sein, ist es das, worauf er hinwies? pic.dhe.ibm.com/infocenter/zos/v1r12/…

    – Ross Aiken

    24. Oktober 2013 um 17:44 Uhr

  • @NordicMainframe: Es ist einige Zeit her, aber die aktuelle Version von clang warnt jetzt korrekt, wenn Sie versuchen, ein bekanntes NULL-Argument an eine Funktion mit a zu übergeben [static 1] Parameterdeklaration.

    – Traumlax

    28. Dezember 2014 um 0:56 Uhr

  • @CiroSantilli巴拿馬文件六四事件法轮功 if (!someArray) { somecode... } entfernt werden konnte

    – MM

    10. Mai 2016 um 21:12 Uhr


1425210cookie-checkWas ist der Zweck des statischen Schlüsselworts im Array-Parameter einer Funktion wie “char s[static 10]”?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy