Absatz 6.7.3.8 der C99-SpezifikationszuständeKonstante Array-Typen in C, Fehler im Standard?
Wenn die Spezifikation eines Array-Typs einen beliebigen Typ-Qualifizierer enthält, ist der Elementtyp so qualifiziert, nicht der Array-Typ. Wenn die Spezifikation eines Funktionstyps einen beliebigen Typqualifizierer enthält, ist das Verhalten nicht definiert.
In der rationale (logische Seite 87, physikalische Seite 94) wird ein Beispiel für das Umsetzen eines flachen Zeigers auf einen Arrayzeiger (mit variabler Länge) angegeben.
void g(double *ap, int n)
{
double (*a)[n] = (double (*)[n]) ap;
/* ... */ a[1][2] /* ... */
}
Sicherlich, wenn das Array ap
nicht innerhalb der Funktion geändert, sollte es markiert const werden, aber die Besetzung in
void g(const double *ap, int n)
{
const double (*a)[n] = (const double (*)[n]) ap;
/* ... */
}
nicht beibehält den const
Qualifier da (pro 6.7.3.8) es gilt für die Elemente des Ziels anstelle des Ziels selbst, das den Array-Typ double[n]
hat. Dies bedeutet, dass Compiler zu Recht beschweren, wenn die entsprechenden Flags (-Wcast-qual
für GCC) gegeben. Es gibt keine Möglichkeit, einen const
Array-Typ in C anzugeben, aber dieser Cast ist sehr nützlich und "korrekt". Das Flag -Wcast-qual
ist nützlich, um den Missbrauch von Array-Parametern zu erkennen, aber die False Positives raten von seiner Verwendung ab. Beachten Sie, dass die Indizierung a[i][j]
sowohl lesbarer ist als auch mit vielen Compilern einen besseren Maschinencode erzeugt als , da erstere ermöglicht, dass eine ganzzahlige Arithmetik mit weniger Analyse aus inneren Schleifen geholt wird.
Sollten Compiler dies nur als Sonderfall behandeln, so dass Qualifier von den Elementen zum Array-Typ gehoben werden, um festzustellen, ob ein bestimmter Cast Qualifier entfernt oder ob die Spezifikation geändert werden sollte? Die Zuweisung ist nicht für Array-Typen definiert. Wäre es also für die Qualifizierer schmerzhaft, sich immer auf den Array-Typ und nicht nur auf die Elemente zu beziehen, im Gegensatz zu 6.7.3.8?
Es windet mich wenn '~ (logische Seite N ≡ physikalische Seite N)'. –