Yo generalmente usan dos de los tres const
s:
const char *const *my_strings;
A veces me gustaría utilizar los tres, pero en mi opinión, el último es el menos importante. Solo ayuda a analizar el código que usa la variable my_strings
, mientras que los otros dos ayudan a analizar el código que tiene cualquier puntero a la matriz apuntada por my_strings
, o a las cadenas apuntadas por los elementos de esa matriz. En general, se trata de más código, en varios lugares diferentes (por ejemplo, el que llama de una función y la función en sí) y, por lo tanto, es una tarea más difícil.
El código que usa la variable en sí está limitado al alcance de my_strings
, por lo que si se trata de una variable automática (incluido un parámetro de función), entonces es una tarea fácil de contener. La ayuda proporcionada marcándola const
aún puede ser apreciada, pero es menos importante.
También diría que si char const * const * const my_strings
es "casi ilegible", eso cambiará cuando tenga más práctica para leer C, y es mejor obtener esa práctica que cambiar el código. Hay algo de valor en escribir el código C que los novatos pueden leer fácilmente, pero no tanto como en hacer un trabajo ;-)
Puede usar typedefs para acortar la definición de la variable, a costa de la introducción de una vía indirecta que molestar a muchos programadores de C:
typedef char const *ro_strptr;
ro_strptr const *my_strings;
Por las razones que sean, los programadores de C a menudo quieren ver lo más posible de un tipo en un solo lugar. Solo cuando el tipo se vuelve verdaderamente complicado (tipos de puntero a función) puede usar un typedef únicamente para abreviar, sin esperar que alguien se queje de él.
Para la segunda mitad de su pregunta, vea la [comp.lang.c FAQ 11.10] (http://c-faq.com/ansi/constmismatch.html) –
@JohnBartholomew: Gracias. No me di cuenta de que podía simplemente lanzar para hacer desaparecer el mensaje. – mk12
Sí, 'const' probablemente debería ser el predeterminado. Creo que Bjarne Stroustup ha dicho lo mismo, pero tenía que mantener la compatibilidad con C. Ya hay una palabra clave 'mutable'. – bames53