Quiero entender la vinculación externa e interna y la vinculación de su diferencia.

También quiero saber el significado de

const variables internamente de enlace por defecto, a menos que de otra manera declarado como extern.

InformationsquelleAutor rkb | 2009-08-31

9 Comentarios

  1. 250

    Cuando se escribe un archivo de implementación (.cpp, .cxx, etc) el compilador genera un unidad de traducción. Este es el objeto de archivo de su archivo de implementación, además de todos los encabezados de que #included en ella.

    Vinculación interna se refiere a todo lo que sólo en el ámbito de una unidad de traducción.

    Vinculación externa se refiere a las cosas que existen más allá de una determinada unidad de traducción. 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).

    • Me gustaría upvote de esto, excepto por un glitch: Una unidad de traducción no es «de alguna manera el archivo de objeto», es el código fuente de la que el compilador crea el archivo objeto.
    • ¿qué es el «algo más importante» que la respuesta es que faltan?
    • Lo siento por la tarde… yo creo que el problema debe ser obvio (además de la precisión de la redacción). Esta respuesta es incompleta, ya que la pregunta acerca de la regla de const variables (así como su finalidad) está totalmente perdido aquí.
  2. 272

    Como dudewat dijo externo vinculación significa el símbolo de la función o variable global) es accesible a través de su programa y interna vinculación significa que es accesible solamente en uno la unidad de traducción.

    Puede controlar explícitamente la vinculación de un símbolo mediante el extern y static palabras clave. Si el vínculo no se especifica, el valor predeterminado de vinculación es extern para noconst símbolos y static (interno) para const símbolos.

    //in namespace 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 foo(); //extern by default
    static int bar(); //explicitly static 

    Nota que en lugar de utilizar static para la vinculación interna es mejor utilizar anónimo espacios de nombres en el que también se puede poner classes. La relación anónima de los espacios de nombres ha cambiado entre C++98 y C++11, pero lo principal es que son inalcanzables de otras unidades de traducción.

    namespace {
       int i; //external linkage but unreachable from other translation units.
       class invisible_to_others { };
    }
    • La aplicación de la «exportación» de la palabra clave de relieve una diferencia entre una función declarada «estático» y una función declarada en el espacio de nombres sin nombre. Para resumir lo mejor que pueda, de una plantilla de función declarada con la exportación de palabras clave en una unidad de traducción se puede referir a una función definida en un espacio de nombres sin nombre de una traducción diferente de la unidad como un resultado de 2-fase de búsqueda. (ddj.com/showArticle.jhtml?articleID=184401584)
    • Lo que si hago lo siguiente: 1.cpp <code>const int ci;</código de> 2.cpp <code>extern const int ci;</código de>
    • usted recibirá un símbolo sin resolver de error (lo siento por los nueve meses de retraso en la contestación que me perdí de este comentario).
    • Gracias por mencionar el anónimo de espacio de nombres. No me di cuenta de esta característica antes!
    • La información que se podría mejorar mucho esta respuesta: 1) estático no es obsoleto ya en C++11. 2) anónimo miembros del espacio de nombres en C++11 de vinculación interna por defecto. Consulte stackoverflow.com/questions/10832940/…
    • gracias no me di cuenta de que el cambio en la norma, he quitado la reclamación. ¿Usted tiene un de referencia de que el uso de static se recomienda más el uso de espacios de nombres sin nombre?
    • Yo no he dicho eso. También creo que es la otra manera alrededor. Por lo que entiendo, el comité primera obsoleto estático entonces había razones para mantener que yo no sé; aún anónimos espacio de nombres es más recomanded pero no tengo una fuente acerca de esto.
    • OK voy a volver a la palabra, gracias por tu aporte
    • Corden : la palabra «exportación» se considera obsoleto en C++11
    • Sí – buen punto. El cambio es aún más significativo. C++ ’11 ha cambiado la vinculación de los identificadores en un espacio de nombres sin nombre a la vinculación interna. Por lo que no hay diferencia en nada más.
    • ¿Qué significa «la vinculación externa, pero inalcanzable de otras unidades de traducción»? ¿Cómo puede ser inalcanzable, pero todavía externo?
    • en C++98 que no podía tener una plantilla de plantilla en un tipo interno para este propósito un tipo declarado en un espacio de nombres anónimos estaba bien. No sé si esta distinción (externo pero inalcanzable) no tiene ningún significado en C++11.
    • Es que la única diferencia?
    • Si es estática declaración hace una vinculación interna , ¿cómo podemos acceder a las variables estáticas en cualquier lugar dentro de un archivo ,por favor me corrija si me estoy equivocando .
    • Usted puede acceder a ella según la regular C++ reglas (sólo después de que se ha declarado y en el ámbito correcto).
    • Si he de declarar una función como la anulación del(); en un archivo.c, la definen en b.c y por último la llamada de una.c, no va a funcionar (como la declaración de una función() en un archivo.c es extern en la vinculación por defecto)? Al parecer, como yo gcc un.c b.c, da error de referencia indefinida a una!
    • suena como debería funcionar. Hiciste todas sus desaceleraciones y definiciones en el ámbito global?
    • todo está en el ámbito global, es decir, la definición de la función main() en un.c, la declaración de la función() en una.c y la definición de la función a() b.c; estas son las únicas funciones que se usan; la función a() es llamado desde main() en un.c;
    • He comprobado que funciona como lo describo en gcc 4.4.7 (para C y C++). Si usted está enfrentando problemas por favor enviar una pregunta al respecto (los comentarios no son, realmente, el lugar para hacer esto)
    • Downvote porque en C++ de la terminología, la accesibilidad es totalmente diferente a la vinculación.
    • La palabra clave export es directamente eliminado de C++11, aunque es reservado (todavía como una palabra clave) para uso futuro. características Obsoletas en C++ son totalmente diferentes, que todavía requieren para ser implementado conformando implementaciones.

  3. 88
    • Una variable global ha vinculación externa por defecto. Su ámbito de aplicación puede ser extendida a otros archivos que contienen dando una coincidencia extern declaración en el otro archivo.
    • El alcance de una variable global puede ser restringido para el archivo que contiene su declaración por el prefijo de la declaración con la palabra clave estática. Tales variables, se dice que el vinculación interna.

    Considere el siguiente ejemplo:

    1.cpp

    void f(int i);
    extern const int max = 10;
    int n = 0;
    int main()
    {
        int a;
        //...
        f(a);
        //...
        f(a);
        //...
    }
    1. La firma de la función f declara f como una función con vinculación externa(por defecto). Su definición debe ser proporcionada más adelante en este archivo o en otra unidad de traducción (a continuación).
    2. max se define como una constante entera. La vinculación predeterminada para las constantes es interna. Su vinculación es cambiado a la externa con la palabra clave extern. Así que ahora max se puede acceder en otros archivos.
    3. n se define como una variable de tipo entero. El valor predeterminado de la vinculación de las variables definidas fuera de la función de los órganos externo.

    2.cpp

    #include <iostream>
    using namespace std;
    
    extern const int max;
    extern int n;
    static float z = 0.0;
    
    void f(int i)
    {
        static int nCall = 0;
        int a;
        //...
        nCall++;
        n++;
        //...
        a = max * z;
        //...
        cout << "f() called " << nCall << " times." << endl;
    }
    1. max se declara vinculación externa. Una coincidencia de la definición de max(con vinculación externa) debe aparecer en algún archivo. (Como en 1.cpp)
    2. n se declara vinculación externa.
    3. z es definido como una variable global con vinculación interna.
    4. La definición de nCall especifica nCall a ser una variable que conserva su valor a través de llamadas a la función f(). A diferencia de las variables locales con el valor predeterminado auto de clase de almacenamiento, nCall se inicializa sólo una vez al inicio del programa, y no una vez por cada invocación de f(). El especificador de clase de almacenamiento estática afecta a la vida útil de la variable local y no a su alcance.

    NB: La palabra clave estática juega un doble papel. Cuando se utiliza en las definiciones de las variables globales, especifica vinculación interna. Cuando se utiliza en las definiciones de las variables locales, se especifica que la duración de la variable que va a ser la duración del programa, en lugar de ser la duración de la función.

    Espero que ayude!

    • Es importante destacar que, cuando se utiliza en las definiciones de las variables locales, static permite perezoso único de inicialización (lo cual puede ser útil si usted necesita un global-ish objeto, sino que tiene que controlar cuando se construye debido a problemas con la construcción global de la orden y no se puede asignar dinámicamente usando new mientras más en profundidad la inicialización de los regímenes pueden ser más allá de lo que es necesario para que el objeto en cuestión; por implicación, esto es principalmente un problema en sistemas embebidos que el uso de C++).
    • Muy Buen Ejemplo, hizo que mi día.
  4. 26

    En términos de ‘C’ (Porque la palabra clave static ha significado diferente entre ‘C’ & ‘C++’)

    Vamos a hablar acerca de distinto ámbito en ‘C’

    ALCANCE: se trata básicamente de ¿cuánto tiempo puedo ver algo y en qué medida.

    1. Variable Local : Ámbito de aplicación sólo está dentro de una función. Reside en el área de PILA de memoria RAM.
      Lo que significa que cada vez que una función se llama a todas las variables
      que son la parte de la función, incluyendo los argumentos de la función
      recién se crean y se destruyen una vez que el control queda fuera de la
      la función. (Porque la pila se vacía cada vez que la función devuelve)

    2. Variable estática: Ámbito de aplicación este es un archivo. Es accesible en todo lugar, en el archivo

      en que se declara. Reside en el segmento de DATOS de la memoria RAM. Desde
      esto solo se puede acceder dentro de un archivo y, por tanto, vinculación INTERNA. Cualquier

      otros archivos no pueden ver en esta variable. De hecho es la palabra clave STATIC
      única manera en la cual podemos introducir algún nivel de datos o función

      escondido en ‘C’

    3. Variable Global: Ámbito de aplicación de la presente es para toda la aplicación. Es accesible por cada
      cuando de la aplicación. Las variables globales reside también en el segmento de DATOS
      Dado que se puede acceder en todo lugar, en la aplicación y por lo tanto
      La Vinculación EXTERNA

    Por defecto, todas las funciones son globales. En el caso, si usted necesita
    ocultar algunas de las funciones en un archivo de fuera, puede prefijo de la estática
    la palabra clave para la función. 🙂

    • gran explicación
    • Como para 1) variables locales no tienen que estar en la pila que se encuentran normalmente en la pila, pero puede ser en los registros y en el BRAZO de un entorno en el que se encuentran más a menudo en los registros que en la pila (depende de algunos factores – de nivel de llamada, número de formal args..)
    • Como para 1) Si consideramos ‘de color’ como sobrescribir – esto está mal. Puntero de pila se acaba de mudar a un lugar diferente. No ‘anteriormente válido local vars’ son ‘vacía’/desactivada etc. Mezclar ámbito de la variable con el tiempo de almacenamiento. Alcance indica desde donde se puede acceder a un var. El tiempo de almacenamiento indica cuánto tiempo existe. Usted puede tener la variable local con el almacenamiento estático duración. Esto significa que se vive «para siempre», pero se puede acceder a partir de una función se declara.
    • Downvote de conceptos inexactos y obvio conceptos erróneos. Estrictamente hablando, no es «global», ni «variable» (como sustantivo) se define en C. Usted probablemente desea consulte «archivo de alcance de objetos» en lugar de «variable global», pero al hablar de «ámbito de aplicación» (en C es una propiedad de un identificador) de que es un disparate. (Ambos términos son definidos en C++ normativamente con un poco diferentes significados.)
  5. 11

    Antes de hablar acerca de la pregunta, es mejor saber el término la unidad de traducción, programa y algunos conceptos básicos de C++ (en realidad, la vinculación es uno de ellos, en general), precisamente. Usted también tiene que saber qué es un alcance.

    Voy a destacar algunos puntos clave, esp. los desaparecidos en respuestas anteriores.

    Vinculación es una propiedad de un nombre, que es introducido por una declaración. Diferentes nombres puede denotar mismo entidad (normalmente, un objeto o una función). Por ello, hablar vinculación de una entidad generalmente es una tontería, a menos que esté seguro de que la entidad sólo serán remitidos por el único nombre de algunas declaraciones específicas (por lo general una declaración, aunque).

    Nota un objeto es una entidad, sino un variable no lo es. Al hablar acerca de la vinculación de una variable, en realidad el nombre de la entidad denotada (que es introducido por una declaración específica) se refiere. La vinculación de su nombre es uno de los tres: no hay vinculación, la vinculación interna o externa de vinculación.

    Diferentes unidades de traducción pueden compartir la misma declaración de encabezado/archivo de origen (sí, es el estándar de la redacción) la inclusión. Así que usted puede consultar con el mismo nombre en diferentes unidades de traducción. Si el nombre ha declarado la vinculación externa, la identidad de la entidad referida por el nombre también es compartida. Si el nombre ha declarado vinculación interna, con el mismo nombre en diferentes unidades de traducción denota diferentes entidades, pero que puede referirse a la entidad en los diferentes ámbitos de la misma unidad de traducción. Si el nombre no tiene ninguna vinculación, usted simplemente no puede referirse a la entidad desde otros ámbitos.

    (Ups… he encontrado lo que he escrito era algo sólo la repetición de el texto estándar …)

    También hay algunas otras confuso puntos que no están cubiertos por la especificación del lenguaje.

    1. Visibilidad (de nombre). También es una propiedad de declarado nombre, pero con un significado diferente a la vinculación.
    2. La visibilidad (de un efecto secundario). Esto no está relacionado con este tema.
    3. Visibilidad (de un símbolo). Esta noción puede ser utilizado por implementaciones reales. En tales implementaciones, un símbolo con el específico de la visibilidad en código objeto (binario) es generalmente el objetivo asignan a partir de la definición de la entidad cuyos nombres tengan el mismo específicos de la vinculación en la fuente de código (C++). Sin embargo, generalmente no se garantiza uno-a-uno. Por ejemplo, un símbolo de una biblioteca dinámica imagen se puede especificar que sólo se comparte en la imagen internamente a partir del código fuente (que participa con algunas extensiones, normalmente, __attribute__ o __declspec) o opciones del compilador, y la imagen no es todo el programa o el archivo de objeto traducido de una unidad de traducción, por lo tanto ningún concepto estándar puede describirlo con precisión. Desde el símbolo no es una normativa término en C++, es sólo un detalle de implementación, aunque los relacionados con las extensiones de los dialectos de mayo han sido ampliamente adoptado.
    4. Accesibilidad. En C++, esto es por lo general alrededor la propiedad de los miembros de la clase o clases base, que es de nuevo un concepto diferente relacionados con el tema.
    5. Global. En C++, «global» se refiere a algo de espacio de nombres global o global ámbito de espacio de nombres. El último es más o menos equivalente a el ámbito de archivo en el lenguaje C. Tanto en C y C++, el vínculo no tiene nada que ver con el ámbito de aplicación, aunque el alcance (como la vinculación) también está bien de que se trate con un identificador (en C) o un nombre (en C++) introducido por algunos declaración.

    La la vinculación de la regla de ámbito de espacio de nombres const variable es algo especial (y muy diferente a la const objeto declarado en el ámbito de los archivos en lenguaje C que también tiene el concepto de la vinculación de los identificadores). Desde RLL es forzada por C++, es importante no guardar más de una definición de la misma variable o función se produjo en todo el programa, excepto para línea funciones. Si no hay tal regla especial de const, una simple declaración de const variable con inicializadores (por ejemplo,= xxx) en un encabezado o un archivo de origen (a menudo un «archivo de encabezado») incluidos por múltiples unidades de traducción (o incluido en una unidad de traducción más de una vez, aunque rara vez) en un programa de violar la ODR, lo que hace que el uso de const variable como la sustitución de algún objeto-como macros imposible.

    • Esta respuesta suena muy competente, y que podría ser muy exacto (no puedo juzgar eso), pero lo más probable es que no es tan comprensible como deseado por muchas de las personas que buscan esta pregunta aquí, en lugar de leer directamente el lenguaje de especificación. Al menos para mis necesidades voy a seguir con el aceptado respuesta pero aún así gracias por dar un pequeño vistazo en el lenguaje de especificación. 👍🏻
  6. 5

    Creo Internos y Externos de la Vinculación en C++ da una explicación clara y concisa:

    Una unidad de traducción se refiere a una aplicación (.c/.cpp archivo y todos los
    encabezado (.h/.ch) los archivos que contiene. Si un objeto o una función dentro de
    tal unidad de traducción tiene vinculación interna, luego de que determinadas
    símbolo sólo es visible para el enlazador en que la unidad de traducción. Si
    un objeto o función de la vinculación externa, el vinculador pueden ver también
    cuando el procesamiento de otras unidades de traducción. La palabra clave static, cuando se utiliza
    en el espacio de nombres global, obliga a un símbolo tener vinculación interna. El
    palabra clave extern resultados en un símbolo tener vinculación externa.

    El compilador valores predeterminados de la vinculación de los símbolos que:

    No const variables globales tienen vinculación externa por defecto

    Const variables globales tienen vinculación interna por defecto

    Funciones de vinculación externa por defecto

  7. 5

    Vinculación determina si los identificadores que tienen los mismos nombres se refieren al mismo objeto, función, o de otra entidad, incluso si los identificadores que aparecen en las diferentes unidades de traducción. La vinculación de un identificador depende de cómo se declaró.
    Hay tres tipos de vínculos:

    1. Vinculación interna : identificadores sólo puede ser visto dentro de una unidad de traducción.
    2. Vinculación externa : identificadores puede ser visto (y se refiere) en otras unidades de traducción.
    3. Ninguna vinculación : identificadores sólo puede ser visto en el ámbito en el que están definidas.
      La vinculación no afecta ámbito

    C++ sólo : Usted también puede tener vinculación entre C++ y C++ que no fragmentos de código, que se llama idioma vinculación.

    Fuente :IBM Programa de Vinculación

  8. 4

    Básicamente

    • extern linkage variable es visible en todos los archivos
    • internal linkage variable es visible en un solo archivo.

    Explicar: las variables const internamente de enlace por defecto, a menos que de otra manera declarado como extern

    1. por defecto, la variable global es external linkage
    2. pero, const variable global es internal linkage
    3. extra, extern const variable global es external linkage

    Un muy buen material acerca de la vinculación en C++

    http://www.goldsborough.me/c/c++/enlazador/2016/03/30/19-34-25-internal_and_external_linkage_in_c++/

  9. 1

    En C++

    Cualquier variable en el ámbito de archivo y que no está anidado dentro de una clase o función, es visible a través de todas las unidades de traducción en un programa. Esto se llama vinculación externa porque en el momento de enlazar el nombre es visible para el enlazador en todas partes, externas a la unidad de traducción.

    Variables globales y funciones comunes tienen vinculación externa.

    Estática objeto o un nombre de función en el ámbito de archivo es local a la unidad de traducción. Que es
    llamado como Vinculación Interna

    Vinculación se refiere sólo a los elementos que tienen direcciones en el enlace/tiempo de carga; por lo tanto, declaraciones de clase y las variables locales no tienen ninguna vinculación.

    • const variables globales tienen vinculación interna.

Dejar respuesta

Please enter your comment!
Please enter your name here