¿Por qué const implica un enlace interno en C++, cuando no es así en C?

Resuelto Johan Kotlinski asked hace 15 años • 7 respuestas

Ver tema. ¿Que estaban pensando?

ACTUALIZACIÓN: Se cambió de "estático" a "vínculo interno" para evitar confusiones.

Para dar un ejemplo... Poniendo lo siguiente en un archivo:

const int var_a = 1;
int var_b = 1;

...y compilando g++ -c test.cppsolo con exportaciones var_b.

Johan Kotlinski avatar Jun 16 '09 04:06 Johan Kotlinski
Aceptado

Creo que te refieres

¿Por qué const implica un enlace interno en C++?

Es cierto que si declara un objeto constante en el ámbito del espacio de nombres, entonces tiene un enlace interno.

El Apéndice C ( C++11, C.1.2 ) proporciona la justificación

Cambio: un nombre de alcance de archivo que se declara explícitamente constante, y no se declara explícitamente externo, tiene un enlace interno, mientras que en C tendría un enlace externo.

Justificación: debido a que los objetos const se pueden usar como valores en tiempo de compilación en C++, esta característica insta a los programadores a proporcionar valores inicializadores explícitos para cada const. Esta característica permite al usuario colocar objetos constantes en archivos de encabezado que se incluyen en muchas unidades de compilación.

Johannes Schaub - litb avatar Jun 15 '2009 21:06 Johannes Schaub - litb

Como dijo litb, constlos objetos tienen enlaces internos en C++. Esto se debe a que están pensados ​​para usarse así:

// a.cpp
const int BUFSIZE = 100;
char abuf[BUFSIZE];

// b.cpp
const int BUFSIZE = 256
int bbuf[BUFSIZE];
 avatar Jun 15 '2009 21:06

Const y static son conceptos ortogonales tanto en C como en C++.

La constpalabra clave le dice al compilador que no permita que la variable aparezca como valor l de cualquier expresión, esencialmente haciéndola de solo lectura.

En C, la staticpalabra clave tiene varios usos dependiendo de a qué se aplica. Cuando se aplica a una variable de una función, indica que la variable no está almacenada en el ámbito local de una función, pero es accesible a través de invocaciones de la misma. Cuando se aplica a una variable o función global, solo se puede acceder a ella desde un archivo en particular; en otras palabras, solo se puede acceder a ella dentro de la unidad de compilación (a menos que se declare extern).

En C++, la staticpalabra clave se puede usar dentro de una definición de clase, para hacer que una variable o funciones se compartan entre todas las instancias de la clase, en lugar de ser locales para cada instancia. Además, una función de clase estática en C++ solo puede acceder a variables estáticas de esa clase (o clases a las que tiene acceso). Ahora, en C++ constproporciona a los miembros un enlace interno a la unidad de compilación a menos que se declaren explícitamente extern; esto puede ser a lo que se refiere. Esto permite compartir constantes en tiempo de compilación entre unidades mediante el uso de archivos de encabezado. Sin embargo, tenga en cuenta que los miembros no son realmente estáticos; más bien, la constante se compila en cada ubicación a la que se hace referencia.

LBushkin avatar Jun 15 '2009 21:06 LBushkin