¿Qué es la vinculación externa y la vinculación interna?

Resuelto rkb asked hace 15 años • 9 respuestas

Quiero entender el vínculo externo y el vínculo interno y su diferencia.

También quiero saber el significado de

constLas variables se vinculan internamente de forma predeterminada a menos que se declare lo contrario como extern.

rkb avatar Sep 01 '09 00:09 rkb
Aceptado

Cuando escribe un archivo de implementación ( .cpp,, .cxxetc.), su compilador genera una unidad de traducción . Este es el archivo fuente de su implementación más todos los encabezados que #includecontiene.

El vínculo interno se refiere a todo lo que está dentro del alcance de una unidad de traducción .

El enlace externo se refiere a cosas que existen más allá de una unidad de traducción en particular. En otras palabras, accesible a través de todo el programa , que es la combinación de todas las unidades de traducción (o archivos objeto).

dudewat avatar Aug 31 '2009 17:08 dudewat

Como dijo dudewat, el enlace externo significa que se puede acceder al símbolo (función o variable global) en todo el programa y el enlace interno significa que solo se puede acceder a él en una unidad de traducción .

Puede controlar explícitamente el vínculo de un símbolo utilizando las palabras clave externy static. Si no se especifica el vínculo, entonces el vínculo predeterminado es extern(vínculo externo) para no constsímbolos y static(vínculo interno) para constsímbolos.

// In namespace scope or global scope.
int i; // extern by default
const int ci; // static by default
extern const int eci; // explicitly extern
static int si; // explicitly static

// The same goes for functions (but there are no const functions).
int f(); // extern by default
static int sf(); // explicitly static 

Tenga en cuenta que en lugar de utilizar static(enlace interno), es mejor utilizar espacios de nombres anónimos en los que también puede colocar classes. Aunque permiten externla vinculación, los espacios de nombres anónimos son inaccesibles desde otras unidades de traducción, lo que hace que la vinculación sea efectiva static .

namespace {
  int i; // extern by default but unreachable from other translation units
  class C; // extern by default but unreachable from other translation units
}
Motti avatar Aug 31 '2009 18:08 Motti