¿Por qué const implica un enlace interno en C++, cuando no es así en C?
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.cpp
solo con exportaciones var_b
.
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.
Como dijo litb, const
los 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];
Const y static son conceptos ortogonales tanto en C como en C++.
La const
palabra 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 static
palabra 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 static
palabra 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++ const
proporciona 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.