Bei dem Versuch, einen C11-Parser (für Bildungszwecke) zu implementieren, fand ich, dass C11 (p. 470) in, sondern auch in C99 (p. 412) (dank Johannes!), Die direkte declarator ist wie folgt definiert:Was bedeutet "[*]" (Sternmodifikator) in C?
(6.7.6) direct-declarator:
direct-declarator [ type-qualifier-list? * ]
Zuerst habe ich dachte, dies sei ein Fehler in der Grammatik (die Typliste sollte nicht optional sein). Allerdings, wenn ich das ausprobiert in meinen Referenz-Compiler (Klappern), bekam ich einen ziemlich unerwarteten Fehler:
int array[*] = { 1, 2, 3 };
// error: star modifier used outside of function prototype
So offensichtlich, (in Klirren) dies den Stern genannt wird Modifikator.
Ich lernte schnell, dass sie nur in Funktionssignaturen verwendet werden können:
void foobar(int array[*])
Sie können jedoch nur in der Erklärung verwendet werden. auch versuchen, es in einer Funktionsdefinition führt zu einem Fehler zu verwenden:
void foobar(int array[*]) {
// variable length array must be bound in function definition
}
So soweit ich das beurteilen kann, ist das beabsichtigte Verhalten [*]
in der Funktionsdeklaration zu verwenden und dann eine feste Anzahl verwenden in der Funktionsdefinition.
// public header
void foobar(int array[*]);
// private implementation
void foobar(int array[5]) {
}
Aber ich habe es nie gesehen, und ich verstehe nicht ganz den Zweck, es entweder.
- Was ist der Zweck, warum wurde es hinzugefügt?
- Was ist der Unterschied mit
int[]
? - Was ist der Unterschied mit
int *
?
Es ist in C seit C99 gewesen. Ich glaube, es bedeutet "Platzhalter für VLA-Nummer hier". 'int [] []' ist nicht gültig, aber 'int [] [*]' ist (in einem nicht-definierenden Funktionsprototyp). –
Sie haben Recht, ich habe vergessen, es zu erwähnen, aber ich suchte nach den Fehlern, die ich von clang bekommen habe und sie entsprachen ihrer VLA-Unit-Testsuite. Trotzdem würde ich gerne ihren Zweck kennen. Vielen Dank! – elslooo
22 Aufrufe und dies ist bereits das erste Google-Ergebnis für "c star modifier". Sie haben eine obskure Funktion getroffen. – ApproachingDarknessFish