Párrafo 6.7.3.8 de los estados de especificación C99tipos de matriz constante en C, defecto en estándar?
Si la especificación de un tipo de matriz incluye cuali fi cadores cuali fi cados, el tipo de elemento está calificado, no el tipo de matriz. Si la especificación de un tipo de función incluye cuali fi cadores de tipo, el comportamiento es indefinido.
En el rationale (página lógica 87, página física 94), se proporciona un ejemplo de conversión de un puntero plano a un puntero de matriz (longitud variable).
void g(double *ap, int n)
{
double (*a)[n] = (double (*)[n]) ap;
/* ... */ a[1][2] /* ... */
}
Ciertamente, si la matriz ap
no se modifica dentro de la función, que debe ser marcado const, sin embargo el reparto en
void g(const double *ap, int n)
{
const double (*a)[n] = (const double (*)[n]) ap;
/* ... */
}
no conserva el const
calificador desde (por 6.7.3.8) se se aplica a los elementos del objetivo en lugar del propio objetivo, que tiene el tipo de matriz double[n]
. Esto significa que los compiladores se quejarán correctamente si se les dan los indicadores apropiados (-Wcast-qual
para GCC). No hay forma de indicar un tipo de matriz const
en C, pero este modelo es muy útil y "correcto". El indicador -Wcast-qual
es útil para identificar el uso indebido de los parámetros de la matriz, pero los falsos positivos desalientan su uso. Tenga en cuenta que la indexación a[i][j]
es más legible y, con muchos compiladores, produce un mejor código de máquina que ap[i*n+j]
, ya que el primero permite que parte de la aritmética entera se levante de los bucles internos con menos análisis.
¿Deberían los compiladores tratar esto como un caso especial, alzando efectivamente los calificadores de los elementos al tipo de matriz para determinar si un elenco dado elimina los calificadores o debería modificarse la especificación? La asignación no está definida para los tipos de matriz, por lo tanto, ¿le molestaría a los calificadores aplicar siempre al tipo de matriz en lugar de solo a los elementos, en contraste con 6.7.3.8?
Me enrolla cuando '~ (página lógica N ≡ página física N)'. –