Quiero entender el enlace externo y el enlace interno y su diferencia.
También quiero saber el significado de
constLas variables se vinculan internamente por defecto a menos que se declare lo contrarioextern.
Cuando se escribe un archivo de aplicación ( .cpp, .cxx, etc.) el compilador genera una unidad de traducción . Este es el archivo fuente de su implementación más todas las cabeceras que #includeincluyó en él.
Enlace interno se refiere a todo solo en el alcance de una unidad de traducción .
La vinculación externa se refiere a cosas que existen más allá de una unidad de traducción 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 de objetos).
constvariables (así como su propósito) se pierde por completo aquí.Como dudewat, dicho enlace externo significa que el símbolo (función o variable global) es accesible a través de su programa y el enlace interno significa que solo es accesible en una unidad de traducción .
Puede controlar explícitamente el enlace de un símbolo utilizando las palabras clave
externystatic. Si no se especifica el enlace, el enlace predeterminado esexternpara los que no sonconstsímbolos ystatic(interno) para losconstsímbolos.Tenga en cuenta que en lugar de usar
staticpara enlaces internos, es mejor usar espacios de nombres anónimos en los que también puede ponerclasses. El enlace para espacios de nombres anónimos ha cambiado entre C ++ 98 y C ++ 11, pero lo principal es que no se puede acceder desde otras unidades de traducción.fuente
externdeclaración coincidente en el otro archivo.static. Dichas variables se dice que tienen enlace interno .Considere el siguiente ejemplo:
1.cpp
fdeclarafcomo una función con enlace externo (predeterminado). Su definición se debe proporcionar más adelante en este archivo o en otra unidad de traducción (se proporciona a continuación).maxse define como una constante entera. El enlace predeterminado para las constantes es interno . Su enlace se cambia a externo con la palabra claveextern. Entonces ahoramaxse puede acceder en otros archivos.nse define como una variable entera. El enlace predeterminado para las variables definidas fuera de los cuerpos de función es externo .2.cpp
maxse declara que tiene enlace externo .maxDebe aparecer una definición coincidente para (con enlace externo) en algún archivo. (Como en 1.cpp)nse declara que tiene enlace externo .zse define como una variable global con enlace interno .nCallespecificanCallque es una variable que retiene su valor en las llamadas a la funciónf(). A diferencia de las variables locales con la clase de almacenamiento automático predeterminada,nCallse inicializarán solo una vez al inicio del programa y no una vez por cada invocación def(). El especificador de clase de almacenamientostaticafecta la vida útil de la variable local y no su alcance.NB: la palabra clave
staticjuega un doble papel. Cuando se usa en las definiciones de variables globales, especifica el enlace interno . Cuando se usa en las definiciones de las variables locales, especifica que la vida útil de la variable será la duración del programa en lugar de ser la duración de la función.¡Espero que ayude!
fuente
staticpermite una inicialización simple perezosa (que puede ser útil si necesita un objeto global-ish pero tiene que controlar cuándo se construye debido a problemas con el orden de construcción global y no puede asignarlo dinámicamente) el uso denewesquemas de inicialización más profundos puede estar más allá de lo necesario para el objeto en cuestión; por implicación, esto es principalmente un problema en los sistemas integrados que usan C ++).En términos de 'C' (porque la palabra clave estática tiene un significado diferente entre 'C' y 'C ++')
Hablemos de diferentes alcances en 'C'
ALCANCE: Básicamente es cuánto tiempo puedo ver algo y qué tan lejos.
Variable local: el alcance solo está dentro de una función. Reside en el área STACK de RAM. Lo que significa que cada vez que se llama a una función, todas las variables que forman parte de esa función, incluidos los argumentos de la función, se crean recientemente y se destruyen una vez que el control sale de la función. (Debido a que la pila se vacía cada vez que regresa la función)
Variable estática: el alcance de esto es para un archivo. Es accesible desde cualquier lugar del archivo
en el que se declara. Reside en el segmento de DATOS de RAM. Dado que esto solo se puede acceder dentro de un archivo y, por lo tanto, enlace interno. Cualquier
otro archivo no puede ver esta variable. De hecho, la palabra clave STATIC es la única forma en que podemos introducir algún nivel de datos o función que se
oculta en 'C'
Variable global: el alcance de esto es para una aplicación completa. Es accesible desde cualquier lugar de la aplicación. Las variables globales también residen en el segmento DATOS, ya que se puede acceder a todas las partes de la aplicación y, por lo tanto, a la vinculación EXTERNA
Por defecto, todas las funciones son globales. En caso de que necesite ocultar algunas funciones en un archivo desde el exterior, puede anteponer la palabra clave estática a la función. :-)
fuente
Antes de hablar sobre la pregunta, es mejor conocer el término unidad de traducción , programa y algunos conceptos básicos de C ++ (en realidad, el enlace es uno de ellos en general) con precisión. También tendrá que saber qué es un alcance .
Destacaré algunos puntos clave, especialmente. los que faltan en respuestas anteriores.
La vinculación es una propiedad de un nombre , que se introduce mediante una declaración . Diferentes nombres pueden denotar la misma entidad (típicamente, un objeto o una función). Por lo tanto, hablar sobre la vinculación de una entidad generalmente no tiene sentido, a menos que esté seguro de que la entidad solo se referirá con el nombre único de algunas declaraciones específicas (por lo general, una declaración).
Tenga en cuenta que un objeto es una entidad, pero una variable no lo es. Al hablar sobre el enlace de una variable, en realidad se refiere al nombre de la entidad denotada (que se introduce mediante una declaración específica). El enlace del nombre se encuentra en uno de los tres: sin enlace, enlace interno o enlace externo.
Las diferentes unidades de traducción pueden compartir la misma declaración por encabezado / archivo fuente (sí, es la redacción del estándar) inclusión. Entonces puede referir el mismo nombre en diferentes unidades de traducción. Si el nombre declarado tiene un enlace externo, también se comparte la identidad de la entidad referida por el nombre. Si el nombre declarado tiene un enlace interno, el mismo nombre en diferentes unidades de traducción denota diferentes entidades, pero puede referir la entidad en diferentes ámbitos de la misma unidad de traducción. Si el nombre no tiene vinculación, simplemente no puede referir la entidad desde otros ámbitos.
(Vaya ... descubrí que lo que escribí fue algo así como repetir la redacción estándar ...)
También hay otros puntos confusos que no están cubiertos por la especificación del idioma.
__attribute__o__declspec) u opciones del compilador, y la imagen no es todo el programa o el archivo objeto traducido desde una unidad de traducción, por lo que ningún concepto estándar puede describirlo con precisión. Dado que símbolo no es un término normativo en C ++, es solo un detalle de implementación, a pesar de que las extensiones relacionadas de dialectos pueden haber sido ampliamente adoptadas.La regla de vinculación de la
constvariable de alcance del espacio de nombres es algo especial (y particularmente diferente alconstobjeto declarado en el alcance del archivo en lenguaje C que también tiene el concepto de vinculación de identificadores). Dado que C ++ aplica ODR , es importante mantener no más de una definición de la misma variable o función que se produjo en todo el programa, excepto para lasinlinefunciones . Si no existe dicha regla especial deconst, una declaración deconstvariable más simple con inicializadores (p= xxx. Ej. ) En un encabezado o un archivo fuente (a menudo un "archivo de encabezado") incluido por varias unidades de traducción (o incluido por una unidad de traducción más de una vez, aunque rara vez) en un programa violará ODR, lo que hace que el usoconstvariable como el reemplazo de algunas macros similares a objetos es imposible.fuente
Creo que la vinculación interna y externa en C ++ da una explicación clara y concisa:
fuente
La vinculación determina si los identificadores que tienen nombres idénticos se refieren al mismo objeto, función u otra entidad, incluso si esos identificadores aparecen en diferentes unidades de traducción. El enlace de un identificador depende de cómo se declaró. Hay tres tipos de enlaces:
Solo C ++ : también puede tener una vinculación entre fragmentos de código C ++ y no C ++, lo que se denomina vinculación de lenguaje .
Fuente: Enlace de programa de IBM
fuente
Básicamente
extern linkagevariable es visible en todos los archivosinternal linkageLa variable es visible en un solo archivo.Explique: las variables const se vinculan internamente de forma predeterminada a menos que se declare como externo
external linkageconstla variable global esinternal linkageextern constla variable global esexternal linkageUn material bastante bueno sobre vinculación en C ++
http://www.goldsborough.me/c/c++/linker/2016/03/30/19-34-25-internal_and_external_linkage_in_c++/
fuente
En C ++
Cualquier variable en el alcance del archivo y que no esté anidada dentro de una clase o función, es visible en todas las unidades de traducción de un programa. Esto se llama enlace externo porque en el momento del enlace el nombre es visible para el enlazador en todas partes, externo a esa unidad de traducción.
Las variables globales y las funciones ordinarias tienen un enlace externo.
El objeto estático o el nombre de la función en el alcance del archivo es local para la unidad de traducción. Eso se llama Enlace interno
La vinculación se refiere solo a elementos que tienen direcciones en el enlace / tiempo de carga; por lo tanto, las declaraciones de clase y las variables locales no tienen vinculación.
fuente