¿Por qué const implica un enlace interno en C ++, cuando no lo hace en C?

82

Ver tema. ¿Que estaban pensando?

ACTUALIZACIÓN: Se cambió de "estático" a "enlace 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
fuente

Respuestas:

112

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 ) da la justificación

Cambio: un nombre de alcance de archivo que se declara explícitamente const, y no se declara explícitamente extern, tiene un vínculo interno, mientras que en C tendría un vínculo 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 de inicializador 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
fuente
Parece que los objetos globales que no son constantes también se pueden inicializar, pero ¿por qué el estándar no le da un enlace interno?
Yong Li
13

Como dijo litb, los constobjetos 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];
RobertS apoya a Monica Cellio
fuente
6

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 el lvalue de cualquier expresión, esencialmente haciéndola de solo lectura.

En C, la staticpalabra clave tiene varios usos dependiendo de a qué se aplique. 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 sus invocaciones. Cuando se aplica a una función o variable global, se vuelve accesible solo para un archivo en particular; en otras palabras, es accesible solo 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 en todas las instancias de la clase, en lugar de ser local 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 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 donde se hace referencia.

LBushkin
fuente
6

En C & C ++, el término estático tiene múltiples significados (puede gobernar el enlace y el almacenamiento) .Tendrá que leer el D&E de Stroustrup para apreciar su razón de ser, pero cuando declara que una variable es constante en el ámbito del espacio de nombres, automáticamente tiene un enlace interno, mientras que en C tienes que declararlo estático para forzarlo a tener un enlace interno.

Por supuesto, en C ++, el uso de estático para controlar el enlace ha quedado obsoleto, los espacios de nombres anónimos se pueden usar para simular el enlace interno en C ++.

Se suponía que las variables const en C ++ reemplazaban las constantes del preprocesador, y dado que las constantes del preprocesador solo son visibles en los archivos que las definen, de manera similar, const automáticamente hace que la variable sea visible solo en el archivo que la define.

Faisal Vali
fuente
4

Esos conceptos son ortogonales y no deben pensarse como lo mismo.

Constness es una propiedad de acceso: indica solo si su variable debe ser de solo lectura (const) o de escritura y lectura (no const).

La estáticidad es una propiedad de por vida (y técnicamente la localización de la memoria): 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 un cpp) .

Klaim
fuente
-2

No es así, y el ejemplo más obvio es que si tiene una variable miembro constante (que es inicializada por el constructor, por supuesto), no es compartida por todos los objetos de esa clase, sino individual para cada uno.

class A {
public:
  A(int newx) : x(newx);
private
  int x;
}

litb da la mejor respuesta, arriba.

Alex Brown
fuente
¿No es así siempre? (litb)
RastaJedi
-5

No es así. Escribiendo lo siguiente:

const int i = 0;

no hace iestática (en C o C ++).

Martin Cote
fuente