2012-08-09 17 views
9

Aparentemente es una buena práctica usar const a menos que algo esté destinado a ser mutable, pero ¿qué tan lejos llegas? Si tengo una matriz de cadenas, ¿debería mi firma de función incluir esto?Const-correctness en C

char const * const * const my_strings 

no voy a ser modificándolo absoluto, por lo que es un puntero constante para el primer elemento de una matriz de constantes referencias a los primeros elementos de las matrices de caracteres constantes. Eso es un bocado, y el código es casi ilegible. Todo esto es una estructura de datos simple como argv.

Creo que const debería ser el predeterminado y debería haber una palabra clave mutable.

¿Usted generalmente tiene uno de esos const s? ¿Para qué sirve eso, si todavía puede cambiarlo fácilmente desreferenciando más o menos?

+3

Para la segunda mitad de su pregunta, vea la [comp.lang.c FAQ 11.10] (http://c-faq.com/ansi/constmismatch.html) –

+0

@JohnBartholomew: Gracias. No me di cuenta de que podía simplemente lanzar para hacer desaparecer el mensaje. – mk12

+0

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

Respuesta

5

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.

+0

Casi ilegible, no quise decir que sea difícil de descifrar, ya que parece mucho ruido de línea. – mk12

+0

+1 en el uso de typedefs. Vale la pena señalar que la corrección de const no puede * evitar * que nadie cambie sus datos si realmente lo desea. Por lo tanto, perfeccionar la precisión const a este grado no siempre es útil; indica más el uso previsto. – Scotty

+0

@Scotty: const-correctness puede evitar que otros códigos const-corregir cambien mis datos. Entonces, si realmente quieren cambiarlo, pero son disciplinados, entonces se controlarán y el sistema funcionará. Los programadores C que no son disciplinados causan un comportamiento indefinido, y la modificación de los objetos const es una de las muchas formas en que lo hacen :-) Así que estoy de acuerdo en que indica el uso previsto, de hecho * permitido * uso, pero señalaría ese uso previsto/permitido, es decir, los contratos documentados entre diferentes componentes, es todo lo que se encuentra entre un programa de trabajo y una ruina de fumar. –