¿Qué es la vinculación externa y la vinculación interna?
Quiero entender el vínculo externo y el vínculo interno y su diferencia.
También quiero saber el significado de
const
Las variables se vinculan internamente de forma predeterminada a menos que se declare lo contrario comoextern
.
Cuando escribe un archivo de implementación ( .cpp
,, .cxx
etc.), su compilador genera una unidad de traducción . Este es el archivo fuente de su implementación más todos los encabezados que #include
contiene.
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).
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 extern
y static
. Si no se especifica el vínculo, entonces el vínculo predeterminado es extern
(vínculo externo) para no const
símbolos y static
(vínculo interno) para const
sí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 class
es. Aunque permiten extern
la 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
}