He encontrado un comentario del usuario R .. :
C y C ++ no son el mismo lenguaje. En particular, C
constno tiene nada que ver con C ++const.
Sé que una diferencia entre el constcalificador en C y el constcalificador en C ++ es su enlace predeterminado.
Un objeto declarado en el ámbito del espacio de nombres con constcalificador en C ++ tiene un enlace interno, mientras que en C un objeto con un constcalificador declarado en un ámbito global (sin tener un staticcalificador 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 constcalificador. Solo lo que no puedes hacer o puedes hacer con él en un idioma determinado.
fuente

constno tiene nada que ver con el enlace. Puede tenerstatic consten el alcance del archivo y tiene enlace interno,consthace lo mismo en ambos idiomas.Respuestas:
La diferencia más importante es que en C ++ una
constvariable es una expresión constante (incluso antes de la introducción de C ++ 11constexpr), pero unaconstvariable 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 ++,
constjuega 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
constno 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
constcalificar funciones miembro. Esto no es posible en C ya que no tiene soporte de sintaxis para funciones miembro.C permite que
constlas 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ónny hacer propagación constante.extern const size_t n; static int array[n];no funcionauint32_t const* x = reinterpret_cast<uint32_t const*>(20102012);...volatilecalificar 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,
consttiene la misma semántica en C y C ++ y los encabezados de C aconstmenudo 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.consty 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 = 1en C tiene un enlace externo . Por lo tanto, necesitaríastaticcambiar el enlace a interno. La cita es bastante clara para mí, a diferencia de sus comentarios.