programacion - ¿Por qué const implica vinculación interna en C++, cuando no en C?
programacion orientada a objetos c++ ejemplos (7)
Ver tema. ¿Que estaban pensando?
ACTUALIZACIÓN: se cambió de "estática" a "vinculación interna" para evitar confusiones.
Para dar un ejemplo ... Poner lo siguiente en un archivo:
const int var_a = 1;
int var_b = 1;
... y compilando con g++ -c test.cpp
solo exporta var_b
.
Como dijo litb, los objetos const tienen un enlace interno. Esto se debe a que están destinados a ser usados 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 en C y C ++.
La palabra clave const
le dice al compilador que no permita que la variable se muestre como el valor l de cualquier expresión, esencialmente haciéndolo de solo lectura.
En C, la palabra clave static
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 un archivo en particular; en otras palabras, solo es accesible dentro de la unidad de compilación (a menos que se declare extern
).
En C ++, la palabra clave static
se puede usar dentro de una definición de clase, para hacer que una variable o funciones se compartan en 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 bien, en C ++, const
proporciona a los miembros vinculación interna a la unidad de compilación, a menos que se declaren explícitamente como extern
, puede ser a lo que se refiere. Esto permite que las constantes de tiempo de compilación se compartan entre unidades mediante el uso de archivos de encabezado. Tenga en cuenta, sin embargo, que los miembros no son realmente estáticos, sino que la constante se compila en cada ubicación a la que se hace referencia.
Creo que quieres decir
¿Por qué const implica vinculación interna en C ++
Es verdad que si declaras un objeto const en el ámbito del espacio de nombres, entonces tiene un enlace interno.
El apéndice C da el razonamiento
Cambio: un nombre de ámbito de archivo explícitamente declarado const, y no explícitamente declarado extern, tiene un enlace interno, mientras que en C tendría un enlace externo
Justificación: como los objetos const se pueden usar como valores de tiempo de compilación en C ++, esta característica insta a los programadores a proporcionar valores de inicializador explícitos para cada const. Esta característica permite al usuario poner objetos const en archivos de encabezado que se incluyen en muchas unidades de compilación.
En C & C ++ el término estático tiene múltiples significados (puede gobernar el enlace y el almacenamiento). Tendrás que leer el D & E de Stroustrup para apreciar su lógica, pero cuando declaras que una variable es const en el ámbito del espacio de nombres, automáticamente tiene un enlace interno. en C tienes que declararlo estático para forzarlo a tener un enlace interno.
Por supuesto, en C ++, el uso de enlaces estáticos para controlar ha quedado en desuso, los espacios de nombres anónimos se pueden usar para simular enlaces internos en C ++.
Se suponía que las variables const en C ++ reemplazaran las constantes del preprocesador, y dado que las constantes del preprocesador solo son visibles en los archivos que las definen, de manera similar, const hace que la variable sea visible solo en el archivo que la define.
No es así Escribiendo lo siguiente:
const int i = 0;
no hace que esté estático (en C o C ++).
No es así, y el ejemplo más obvio es que si tiene una variable de miembro const (que es inicializada por el constructor, por supuesto), no es compartida por todos los objetos de esa clase, sino que es individual para cada uno.
class A {
public:
A(int newx) : x(newx);
private
int x;
}
litb da la mejor respuesta, arriba.
Esos conceptos son ortogonales y no deben considerarse como la misma cosa.
Constness es una propiedad de acceso: solo dice si su variable debe ser de solo lectura (const) o write-read (no const).
Staticity es una propiedad de por vida (y técnicamente memoria de localización): indica si la variable será global en el alcance de una clase (cuando está en una clase) o una unidad de traducción (cuando se usa con una variable global definida en una cpp) .