He encontrado un comentario del usuario R .. :
C y C ++ no son el mismo lenguaje. En particular, C
const
no tiene nada que ver con C ++const
.
Sé que una diferencia entre el const
calificador en C y el const
calificador en C ++ es su enlace predeterminado.
Un objeto declarado en el ámbito del espacio de nombres con const
calificador en C ++ tiene un enlace interno, mientras que en C un objeto con un const
calificador declarado en un ámbito global (sin tener un static
calificador antes const
) tiene un enlace externo.
Pero, ¿de qué otra manera ambos difieren entre los lenguajes de C y C ++? He pensado que ambos tienen el mismo tipo de concepto y propósito en ambos idiomas.
Mi pregunta:
- ¿Cuál es la diferencia entre el calificador const en C y el calificador const en C ++?
Las respuestas a ¿Cómo difiere "const" en C y C ++? no señale una diferencia exacta entre los lenguajes de C y C ++ en el contexto del const
calificador. Solo lo que no puedes hacer o puedes hacer con él en un idioma determinado.
fuente
const
no tiene nada que ver con el enlace. Puede tenerstatic const
en el alcance del archivo y tiene enlace interno,const
hace lo mismo en ambos idiomas.Respuestas:
La diferencia más importante es que en C ++ una
const
variable es una expresión constante (incluso antes de la introducción de C ++ 11constexpr
), pero unaconst
variable en C no lo es.Lo que significa que C ++ le permite hacer cosas como,
const size_t n = 1; static int array[n];
pero C no lo permite, supuestamente por razones históricas.En C ++,
const
juega un papel en la determinación de la vinculación. Esto es diferente entre las versiones de C ++. De acuerdo con cppreference.com (el énfasis es mío):Mientras que en C
const
no desempeña ningún papel en la determinación de la vinculación, solo importan el alcance de la declaración y los especificadores de la clase de almacenamiento.En C ++, puede
const
calificar funciones miembro. Esto no es posible en C ya que no tiene soporte de sintaxis para funciones miembro.C permite que
const
las variables calificadas se declaren sin un inicializador. En C, podemos escribirconst int x;
sin inicializadores, pero C ++ no lo permite. De un vistazo, esto puede parecer un error de lenguaje sin sentido en C, pero la razón es que las computadoras tienen registros de hardware de solo lectura con valores establecidos por hardware, no por software. Lo que significa que C sigue siendo adecuado para la programación relacionada con el hardware.fuente
const size_t n = 1; static int array[n];
solo funciona si el compilador puede ver la definiciónn
y hacer propagación constante.extern const size_t n; static int array[n];
no funcionauint32_t const* x = reinterpret_cast<uint32_t const*>(20102012);
...volatile
calificar el puntero.volatile
... El descanso depende. Los depuradores que tenía a mano en estos casos también podrían resolverse fácilmente*x
. Por otro lado, si los registros se asignan a alguna región de memoria y el compilador no admite colocar variables en ubicaciones de memoria específicas directamente (he visto ambas), obtener la variable en una ubicación de memoria específica a veces puede ser un poco complicado (tener que cubrir eso en el archivo del mapa ...). Al final, no me importa mucho tener una variable ubicada en el lugar correcto o un puntero, siempre que pueda hacer la tarea que me asignaron;)Desde cppreference.com :
Aparte de eso,
const
tiene la misma semántica en C y C ++ y los encabezados de C aconst
menudo se compilan como encabezados de C ++ con condicional"extern C"
.fuente
static const x;
en el alcance del archivo en C tiene enlace interno. El enlace de una variable C está determinado por el alcance en el que se declara, así como por la presencia / ausencia de especificadores de clase de almacenamiento.const
y otros calificadores de tipo no juegan parte de ello en absoluto.static const x;
en el alcance del archivo en C tiene un enlace externo.int const x = 1
en C tiene un enlace externo . Por lo tanto, necesitaríastatic
cambiar el enlace a interno. La cita es bastante clara para mí, a diferencia de sus comentarios.