Pregunta

mientras conseguía mi código revisado aquí la cuestión del uso de const Surgió la palabra clave.Entiendo que se utiliza para implementar un comportamiento de solo lectura en variables.

Estoy confundido acerca de cuáles son las diversas situaciones en las que puede resultar útil.

  • ¿Debería utilizarse en aras de la claridad en los prototipos de funciones?
  • ¿Debería utilizarse como medida de seguridad durante el desarrollo del código?
  • ¿Debería utilizarse en el ámbito de varias funciones para declarar constantes de tiempo de ejecución?
  • ¿Debería usarse en absoluto?

Estas preguntas son sólo ejemplos de la confusión a la que me enfrento.La confusión general es

  • ¿Cuándo debería ser el const ¿Palabra clave utilizada en la programación en C?
  • ¿Cuáles son los distintos tipos de beneficios que se pueden obtener al utilizar esta palabra clave en C?
  • ¿Hay alguna desventaja de usar const ¿palabra clave?


Se ha señalado que esta pregunta puede ser demasiado amplia debido a todas estas preguntas en los detalles 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 con qué fines se debe utilizar la palabra clave const en C para las variables?

También se puede reformular como

El uso adecuado de const Palabra clave en C` con los pros y los contras de la misma.

¿Fue útil?

Solución

Al revisar el código, aplico las siguientes reglas:

  • Siempre usa const para los parámetros de función pasados por referencia en los que el parámetro no modifica (ni libera) los datos a los que se apunta.

    int find(const int *data, size_t size, int value);
    
  • Siempre usa const para constantes que de otro modo podrían definirse mediante #define o una enumeración.Como resultado, el compilador puede ubicar los datos en la memoria de solo lectura (ROM) (aunque el vinculador suele ser una mejor herramienta para este propósito en sistemas integrados).

    const double PI = 3.14;
    
  • Nunca uses const en una función prototipo para un parámetro pasado porvalor.No tiene ningún significado y, por tanto, es sólo "ruido".

    // don't add const to 'value' or 'size'
    int find(const int *data, size_t size, int value); 
    
  • Cuando sea apropiado, utilice const volatile en ubicaciones que el programa no puede cambiar pero que aún 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:

    const volatile int32_t *DEVICE_STATUS =  (int32_t*) 0x100;
    

Otros usos son opcionales.Por ejemplo, los parámetros de una función dentro de la función. implementación se puede marcar como constante.

// 'value' and 'size can be marked as const here
int find(const int *data, const size_t size, const int value)  
{
     ... etc

o función devuelve valores o cálculos que se obtienen y luego nunca cambian:

char *repeat_str(const char *str, size_t n) 
{
    const size_t len = strlen(str);
    const size_t buf_size = 1 + (len * n);
    char *buf = malloc(buf_size);
    ...

Estos usos de const simplemente indica que no cambiarás la variable;no cambian cómo ni dónde se almacena la variable.Por supuesto, el compilador puede determinar que una variable no se modifica, pero agregando const le permites hacer cumplir eso.Esto puede ayudar al lector y agregar algo de seguridad (aunque si sus funciones son grandes o lo suficientemente complicado como para que esto marque una gran diferencia, podría decirse que tiene otros problemas). Editar, por ej.una función densamente codificada de 200 líneas con bucles anidados y muchos bucles largos o nombres de variables similares, sabiendo que ciertas variables nunca cambian facilitar la comprensión de manera significativa.Tales funciones han sido mal diseñadas o mantenido.


Problemas con const.Probablemente escuchará el término "intoxicación constante".Esto ocurre al agregar const a un parámetro de función hace que 'constness' propagar.

Editar - envenenamiento constante:por ejemplo en la función:

int function_a(char * str, int n)
{
    ...
    function_b(str);
    ...
}

si cambiamos str a const, entonces debemos asegurarnos de que fuction_b También toma un const.Y así sucesivamente si function_b pasa el str sobre function_c, etc.Como puedes imaginar, esto podría ser doloroso si se propaga a muchos Archivos/módulos separados.Si se propaga a una función que no puede ser (por ejemplo, una biblioteca del sistema), entonces se hace necesaria una conversión.Así que rociandoconst en el código existente quizás esté causando problemas.En código nuevo Sin embargo, es mejor const calificar consistentemente cuando sea apropiado.

El problema más insidioso de const es que no estaba en el original Idioma.Como complemento no encaja del todo.Para empezar, tiene dos significados (como en las reglas anteriores, que significan "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 (dependiendo del compilador/opciones) puede fallar cuando correr:

const char str[] = "hello world\n";
char *s = strchr(str, '\n');
*s = '\0';

strchr devuelve un char* No un const char*.Como su parámetro de llamada esconst debería elenco el parámetro de llamada a char*.Y en este caso que Descarta la propiedad de almacenamiento de solo lectura real. Editar:- esto se aplica generalmente a vars en memoria de solo lectura.Por 'ROM' me refiero no solo a la ROM física sino a cualquier memoria 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 usted have real constantes (es decir,almacenado en ROM) debe tener mucho cuidado de no pierden su constancia.

Otros consejos

Generally in any programming language its recommended to use const or the equivalent modifier since

  • It can clarify to the caller that what they passed in is not going to change
  • Potential speed improvements since the compiler knows for certain it can omit certain things that are only relevant if the parameter can change
  • Protection from yourself accidentally changing the value

In agreement with TheLQ's statements:

When working with a team of programmers declaring const is a good way of indicating that said variable shouldn't be modified, or just for reminding yourself in large projects. It's useful in that sense, and can save many headaches.

Yes, it's basically the TheLQ's answer.

Is a security measure for the programmer so you don't modify a variable, and to not call functions that may modify them. In an array or structure the const specifier indicates that the values of their contents won't be modified, and even the compiler will not allow you to do so. You still can easily change the value of the variable with just a cast however.

In what I have usually see, it's mostly used to add constant values in code, and to indicate that the array or structure won't be modified if you call a particular function. This last part is important, because when you call a function that WILL modify your array or structure, you may want to keep the original version, so you create a copy of the variable and then pass it to function. If that is not the case, you don't require the copy, obviously, so for example you can change,

int foo(Structure s);

to

int foo(const Structure * s);

and not getting the copy overhead.

Just to add, note that C has particular rules with the const specifier. For example,

int b = 1;
const int * a = &b;

is not the same as

int b = 1;
int * const a = &b;

The first code won't allow you to modify a. In the second case, the pointer is constant but its contents is not, so the compiler will allow you to say * a = 3; without a compiler error, but you can't make a to be a reference to another thing.

Licenciado bajo: CC-BY-SA con atribución
scroll top