varias usar una tipos que programacion lenguaje graficas declara datos constantes constante como c standards

usar - Tipos de matriz constante en C, ¿defecto en estándar?



variables y constantes en programacion (3)

Párrafo 6.7.3.8 de los estados de especificación C99

Si la especificación de un tipo de matriz incluye cuali fi cadores de tipo, el tipo de elemento se califica así, 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 razonamiento (página lógica 87, página física 94), se da un ejemplo de lanzar un puntero plano a un puntero de matriz (de 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, se debe marcar const, sin embargo, el molde

void g(const double *ap, int n) { const double (*a)[n] = (const double (*)[n]) ap; /* ... */ }

no conserva el calificador const ya que (según 6.7.3.8) se aplica a los elementos del objetivo en lugar del propio objetivo, que tiene un 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 denotar un tipo de matriz const en C, pero este molde es muy útil y "correcto". El -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 indexar a[i][j] es más legible y, con muchos compiladores, produce un código de máquina mejor que ap[i*n+j] ya que el primero permite sacar aritmética de enteros de bucles internos con menos análisis. .

¿Deberían los compiladores tratar esto como un caso especial, alzando de manera efectiva 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?


La situación es incómoda con punteros (es decir, matrices), pero aquí está mi recuerdo de los detalles:

const double *ap es un puntero a un doble constante;

double *const ap es un puntero constante a un doble;

const double *const ap es un puntero constante a un doble constante;

Así que creo que es posible hacer lo que me pides, aunque no lo he intentado en años: la opción de gcc que estás utilizando no estaba disponible la última vez que lo hice.

EDITAR: Esta respuesta no es correcta para la pregunta: la dejo para preservar los comentarios a continuación, que aclaran el problema para simples mortales (o desarrolladores de C oxidados ...)


Posible solución para el programador C (pero no para el diseñador del compilador):

gcc con -Wcast-qual no se queja de esto:

void g(const double *ap, int n) { int i; struct box { double a[n]; }; const struct box *s = (const struct box *)ap; for (i=0; i<n; ++i) { doStuffWith(s->a[i]); /* ... */ } }

Incluso si no es muy elegante. El miembro de la matriz posterior a también tiene un significado ligeramente diferente entre C89 y C99, pero al menos obtienes el efecto deseado.


Este es un problema conocido que se ha debatido varias veces en los últimos 10 años en comp.std.c. La conclusión es que el caso específico que presentó no es actualmente legal en el Estándar C; necesita eliminar el calificador o abstenerse de usar un puntero a una matriz para referirse a los elementos calificados en la matriz.

Si cree que tiene una buena idea para solucionar el problema, puede publicarlo en las news:comp.std.c para su discusión. Si otros acuerdan que es una buena idea, usted u otra persona puede presentar un informe de defectos para cambiar el comportamiento (hay varios miembros del comité que frecuenten comp.std.c, de modo que los comentarios de las personas que potencialmente revisarían el DR ser útil tener antes de archivarlo). Creo que puede haber algunos problemas con su propuesta para que los calificadores afecten a la matriz en sí, pero tendría que pensarlo un poco más.