Mientras revisaba mi código aquí,const
surgió el problema del uso de la palabra clave. Entiendo que se usa para implementar el comportamiento de solo lectura en las variables.
Estoy confundido acerca de cuáles son las diversas situaciones cuando puede ser útil.
- ¿Debería usarse por razones de claridad en los prototipos de funciones?
- ¿Debería usarse como medida de seguridad durante el desarrollo del código?
- ¿Debería usarse en el ámbito de varias funciones para declarar constantes de tiempo de ejecución?
- ¿Debería usarse en absoluto?
Estas preguntas son solo ejemplos de la confusión que estoy enfrentando. La confusión general es
- ¿Cuándo debería ser la
const
palabra clave utilizada en la programación en C? - ¿Cuáles son los diversos tipos de beneficios que se pueden obtener al usar esta palabra clave en C?
- ¿Hay alguna desventaja de usar
const
palabras clave?
Se ha señalado que esta pregunta puede ser demasiado amplia debido a todas estas preguntas en el detalle de mi pregunta. Solo quería aclarar que estas preguntas son solo para aclarar la confusión con respecto a la pregunta principal.
¿Cuándo y para qué fines se debe usar la palabra clave const en C para las variables?
También se puede reformular como
El uso adecuado de la
const
palabra clave en C` con los pros y los contras de la misma.
c
readability
patterns-and-practices
const
Aseem Bansal
fuente
fuente
Specific issues with software development
. Estoy siendo bastante específico.specific issue
. El uso adecuado de laconst
palabra clave en C` con los pros y los contras de la misma.Respuestas:
Al revisar el código, aplico las siguientes reglas:
Utilice siempre
const
para parámetros de función pasados por referencia donde la función no modifica (o libera) los datos apuntados.Utilice siempre
const
para constantes que de otro modo podrían definirse utilizando un #define o una enumeración. Como resultado, el compilador puede ubicar los datos en la memoria de solo lectura (ROM) (aunque el enlazador suele ser una mejor herramienta para este propósito en los sistemas integrados).Nunca use const en un prototipo de función para un parámetro pasado por valor . No tiene significado y, por lo tanto, es solo 'ruido'.
Cuando corresponda, úselo
const volatile
en ubicaciones que el programa no pueda cambiar, pero que podrían cambiar. Los registros de hardware son el caso de uso típico aquí, por ejemplo, un registro de estado que refleja el estado de un dispositivo:Otros usos son opcionales. Por ejemplo, los parámetros de una función dentro de la implementación de la función se pueden marcar como const.
o la función devuelve valores o cálculos que se obtienen y luego nunca cambian:
Estos usos de
const
solo indican que no cambiará la variable; no cambian cómo o dónde se almacena la variable. El compilador, por supuesto, puede determinar que una variable no se cambia, pero al agregarlaconst
le permite hacer cumplir eso. Esto puede ayudar al lector y agregar algo de seguridad (aunque si sus funciones son lo suficientemente grandes o complicadas como para que esto haga una gran diferencia, posiblemente tenga otros problemas). Editar, por ejemplo. una función densamente codificada de 200 líneas con bucles anidados y muchos nombres de variables largos o similares, sabiendo que ciertas variables nunca cambian podría facilitar la comprensión significativamente. Tales funciones han sido mal diseñadas o mantenidas.Problemas con
const
. Probablemente escuchará el término "envenenamiento constante". Esto ocurre cuando agregarconst
a un parámetro de función hace que se propague 'constness'.Editar - envenenamiento constante: por ejemplo en la función:
si cambiamos
str
aconst
, entonces debemos asegurarnos de quefuction_b
también se necesita aconst
. Y así sucesivamente si sefunction_b
pasastr
afunction_c
, etc. Como puede imaginar, esto podría ser doloroso si se propaga en muchos archivos / módulos separados. Si se propaga a una función que no se puede cambiar (por ejemplo, una biblioteca del sistema), entonces se hace necesaria una conversión. Por lo tanto, rociar elconst
código existente tal vez sea un problema. Sin embargo, en el nuevo código, es mejorconst
calificar consistentemente donde sea apropiado.El problema más insidioso
const
es que no estaba en el idioma original. Como complemento, no encaja del todo. Para empezar, tiene dos significados (como en las reglas anteriores, que significa "No voy a cambiar esto" y "esto no se puede modificar"). Pero más que eso, puede ser peligroso. Por ejemplo, compile y ejecute este código y (según el compilador / opciones) puede bloquearse cuando se ejecuta:strchr
devuelve unchar*
no aconst char*
. Como su parámetro de llamada esconst
, debe enviar el parámetro de llamada achar*
. Y en este caso, eso desecha la verdadera propiedad de almacenamiento de solo lectura. Editar: esto se aplica generalmente a los vars en la memoria de solo lectura. Por 'ROM', me refiero no solo a la ROM física sino a cualquier memoria que esté protegida contra escritura, como sucede con la sección de código de los programas que se ejecutan en un sistema operativo típico.Muchas funciones de biblioteca estándar se comportan de la misma manera, así que tenga cuidado: cuando tiene constantes reales (es decir, almacenadas en ROM) debe tener mucho cuidado de no perder su const.
fuente
const volatile
variable.const
variable realmente es de solo lectura:const
dice "Esto no se puede modificar". A,const volatile
por otro lado, dice "Esto no se puede modificar, pero podría cambiar". Agregaré una mención de volátiles a mi respuesta.const
variable a través de un noconst
puntero" (una pregunta común en SO y todos los demás foros de C !). En general, me gusta esta respuesta, aunque :)const
declara tanto datos de solo lectura como vistas de datos de solo lectura, la diferencia es "esto no se puede modificar" versus "no se puede modificar esto".Generalmente en cualquier lenguaje de programación se recomienda usar
const
o el modificador equivalente ya quefuente
Sí, es básicamente la respuesta de TheLQ.
Es una medida de seguridad para el programador para que no modifique una variable y no invoque funciones que puedan modificarla. En una matriz o estructura, el especificador const indica que los valores de su contenido no se modificarán, e incluso el compilador no le permitirá hacerlo. Sin embargo, aún puede cambiar fácilmente el valor de la variable con solo un reparto.
En lo que generalmente veo, se usa principalmente para agregar valores constantes en el código y para indicar que la matriz o estructura no se modificará si llama a una función en particular. Esta última parte es importante, porque cuando llama a una función que modificará su matriz o estructura, es posible que desee conservar la versión original, por lo que crea una copia de la variable y luego la pasa a la función. Si ese no es el caso, no necesita la copia, obviamente, así que, por ejemplo, puede cambiar,
a
y no obtener la copia de arriba.
Solo para agregar, tenga en cuenta que C tiene reglas particulares con el especificador const. Por ejemplo,
no es lo mismo que
El primer código no le permitirá modificar a. En el segundo caso, el puntero es constante pero su contenido no lo es, por lo que el compilador le permitirá decir
* a = 3;
sin un error del compilador, pero no puede hacera
que sea una referencia a otra cosa.fuente
De acuerdo con las declaraciones de TheLQ:
Cuando se trabaja con un equipo de programadores, declarar
const
es una buena manera de indicar que dicha variable no debe modificarse, o simplemente para recordarse en proyectos grandes. Es útil en ese sentido y puede ahorrar muchos dolores de cabeza.fuente