En el alcance del archivo, no hay diferencia en C++. const
hace que el enlace interno sea el predeterminado, y todas las variables globales tienen una vida útil estática. Pero la primera variante tiene el mismo comportamiento en C, por lo que puede ser una buena razón para usarla.
Dentro de una función, la segunda versión se puede calcular a partir de parámetros, en C o C++ no tiene que ser una constante en tiempo de compilación como lo requieren otros lenguajes.
Dentro de una clase, básicamente lo mismo que para las funciones, se puede calcular un valor de instancia const
en el ctor-initializer-list. Un static const
se establece durante la inicialización de inicio y permanece sin cambios para el resto del programa. (Nota: el código de static
miembros se ve un poco diferente porque la declaración y la inicialización se separan.)
Recuerde, en C++, const
significa sólo lectura, no constante. Si tiene un puntero a const
, entonces otras partes del programa pueden cambiar el valor mientras no mira. Si la variable se definió con const
, entonces nadie puede cambiarla después de la inicialización, pero la inicialización aún puede ser arbitrariamente compleja.
'static' es probablemente la palabra clave más sobrecargada en C++. El significado de su código varía ampliamente dependiendo de si está en el ámbito del espacio de nombres, en el alcance de la clase o en el alcance de la función. Es posible que desee aclarar eso. – sbi
@sbi: pensé que ya lo hice. Alcance de función (donde es un especificador de clase de almacenamiento) y alcance de archivo (donde es un especificador de vinculación). Los miembros de la clase y las variables relacionadas con el espacio de nombres específicamente no me conciernen con respecto a esta pregunta, aunque si alguien siente que hay una distinción interesante, no dude en cubrirla también. – Clifford
@Clifford: Lamento haber pasado por alto esas últimas palabras. Sin embargo, esto reveló un malentendido de su parte: en C++, el alcance del archivo _es_ el ámbito del espacio de nombres. Si declara algo fuera de cualquier espacio de nombre, simplemente pertenecerá al _global namespace_ (y se puede acceder a través de un prefijo '::' sin identificador en el frente). No estoy al tanto de ninguna diferencia significativa entre el espacio de nombres global y el espacio de nombres anidado en él. Ciertamente no hay ningún objeto relacionado con objetos "estáticos". – sbi