¿Cuál es la diferencia entre el calificador const en C y el calificador const en C ++?

9

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.

RobertS apoya a Monica Cellio
fuente
Tantas respuestas a solo una búsqueda de Google. Uno de ellos: stackoverflow.com/questions/4486442/…
schaiba
1
En C, constno tiene nada que ver con el enlace. Puede tener static consten el alcance del archivo y tiene enlace interno,
Lundin
3
Si no está satisfecho con las respuestas actuales a esa pregunta, que es la misma que la suya, considere publicar una recompensa.
Sneftel
3
Estoy de acuerdo en que el duplicado vinculado es malo. Una buena respuesta enumeraría todas las diferencias y no explicaría tanto lo que consthace lo mismo en ambos idiomas.
Lundin
1
Puedo intentar escribir esa respuesta, pero no soy lo suficientemente gurú de C ++ para asegurarme de que tengo cubiertas todas las diferencias. En la parte superior de mi cabeza: las variables const en C ++ son expresiones constantes, a diferencia de C. C ++ puede const calificar las funciones miembro. El enlace mencionado. ¿Algo más?
Lundin

Respuestas:

11
  • La diferencia más importante es que en C ++ una constvariable es una expresión constante (incluso antes de la introducción de C ++ 11 constexpr), pero una constvariable 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):

    Cualquiera de los siguientes nombres declarados en el ámbito del espacio de nombres tiene un enlace interno:


    • no volátil no plantilla (desde C ++ 14) no en línea (desde C ++ 17) no exportado (desde C ++ 20) variables calificadas const (incluido constexpr) que no se declaran extern y aren ' t previamente declarado tener enlace externo;

    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 escribir const 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.

Lundin
fuente
¿Se pueden tener funciones miembro en C?
Maxim Egorushkin
1
Tenga en cuenta que const size_t n = 1; static int array[n];solo funciona si el compilador puede ver la definición ny hacer propagación constante. extern const size_t n; static int array[n];no funciona
Maxim Egorushkin
Hm, prefiero ver que tales registros de hardware se aborden mediante punteros, como uint32_t const* x = reinterpret_cast<uint32_t const*>(20102012);...
Aconcagua
@Aconcagua Eso haría que dichos registros sean incompatibles con el resto del mapa de registros. ¿Y cómo le permitiría ver los valores de registro reales en un depurador? Por ejemplo, si solo desea ver los registros del conjunto de máscara de silicio de solo lectura para ver rápidamente con qué parte ha terminado. Y obviamente, también necesitarías volatilecalificar el puntero.
Lundin
@Lundin Admitido, no prestó atención al 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;)
Aconcagua
0

Desde cppreference.com :

El constcalificador utilizado en una declaración de una variable no local no volátil no local (desde C ++ 14) no en línea (desde C ++ 17) que no se declara externle da un enlace interno. Esto es diferente de C donde las constvariables de alcance del archivo tienen un enlace externo.

Aparte de eso, consttiene la misma semántica en C y C ++ y los encabezados de C a constmenudo se compilan como encabezados de C ++ con condicional "extern C".

Maxim Egorushkin
fuente
1
Es una mala cita, simplificación excesiva. 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.
Lundin
@Lundin ¿Cómo es eso diferente de lo que dice la cita?
Maxim Egorushkin
1
El ejemplo que acabo de dar prueba que la cita es incorrecta. Según la cita, static const x;en el alcance del archivo en C tiene un enlace externo.
Lundin
@Lundin La cita dice que int const x = 1en C tiene un enlace externo . Por lo tanto, necesitaría staticcambiar el enlace a interno. La cita es bastante clara para mí, a diferencia de sus comentarios.
Maxim Egorushkin
1
Realmente no dice eso en absoluto. Lee la cita. "... C donde las variables de alcance del archivo const tienen enlace externo".
Lundin