¿Por qué el enlace externo no se vincula a una variable estática?

4 minutos de lectura

avatar de usuario
Jared Pochtar

Por que extern int n no se compila cuando se declara n (en un archivo diferente) static int npero funciona cuando se declara int n? (Estas dos declaraciones estaban en el ámbito del archivo).

Básicamente, ¿por qué es int n en el alcance del archivo no es lo mismo que static int n en el mismo alcance? ¿Es sólo en relación con extern? Si es así, ¿qué hay de externo que me estoy perdiendo?

avatar de usuario
bmargulies

Todo y todo el propósito de static es declarar que una variable es private al archivo fuente en el que está declarado. Por lo tanto, está haciendo precisamente su trabajo al evitar una conexión de un externo.

Tenga en cuenta que hay cuatro tipos de definición de variable de ámbito de archivo:

  1. int blah = 0; — blah se define en este archivo y se puede acceder a él desde otros archivos. Las definiciones en otros archivos están duplicadas y darán lugar a errores.
  2. extern int blah; — blah debe definirse en otro lugar y se hace referencia a él desde este archivo.
  3. int blah; — Este es el equivalente moral de FORTRAN COMMON. Puede tener cualquier número de estos en archivos, y el enlazador los resuelve en uno compartido. int.
  4. static int blah; static TYPE blah;(opcionalmente con un inicializador) — Esto es estático. Es completamente privado para este archivo. No es visible para los externos en otros archivos, y puede tener muchos archivos diferentes que declaren y son todosdiferente

. Para los puristas de la audiencia: ‘archivo’ =unidad de compilación

. static int bleh = 0; Tenga en cuenta que las funciones internas estáticas (no en el alcance del archivo) tienen un alcance aún más estricto: si dos funciones declaran

incluso en el mismo archivo, no están relacionados. int blah = 0; int blah; : para aquellos de ustedes que no están familiarizados: en el patrón habitual, una unidad de compilación tiene que definir una variable global y otras pueden hacer referencia a ella. ‘Vive’ en esa unidad de compilación. En el caso (3), arriba, ningún archivo (o todos los archivos) lo define. Si dos archivos dicen int , el enlazador se quejará de múltiples definiciones. Si dos archivos dicen

  • el enlazador crea alegremente un solo global

    y hace que todo el código se refiera a él.

    ¿Cómo se llamaría entonces ‘int n’ (en el alcance del archivo), en términos de especificadores de almacenamiento?

  • – Jared Pochtar

    15 mayo 2010 a las 21:15

    @bmargulies: En el alcance del archivo, ¿quieres decir? Porque en el ámbito de la función, una var estática es aquella que retiene su valor después de que las funciones regresan, y en el ámbito de la clase, un miembro estático tiene una sola instancia disponible para todos los objetos.


  • – mingos

    15 mayo 2010 a las 21:16

    @Jared: lo llamo ‘común’. En mi recuerdo, el idioma no define una palabra clave para hacer esto explícito. Si me equivoco, confío en que alguien me corregirá.

  • – bmargulies

    15 mayo 2010 a las 21:19

    @bmargulies: OK, pensé en términos de C++ en lugar de C. Thx.

  • – mingos

    15 mayo 2010 a las 21:21

    jeje. Usted “aclaró” al señalar una construcción fortran análoga. No creo que muchos usuarios de SO se hayan metido con Fortran. 🙂


– Esteban static 15 mayo 2010 a las 22:01 extern En C estándar, hay dos ámbitos para las variables declaradas fuera de una función. A extern static La variable solo es visible dentro de la unidad de compilación (es decir, el archivo) que la declaró, y las variables no estáticas son visibles en todo el programa. Un

la declaración dice que la ubicación de la variable aún no se conoce, pero el enlazador la resolverá; es compatible con variables no estáticas, pero static ¡Es solo una locura!

Por supuesto, en la práctica hay otras visibilidades en estos días.  En particular, ahora hay niveles de alcance entre el de un solo archivo fuente y el de un programa completo;  el nivel de una sola biblioteca compartida es útil (configurable a través de mecanismos como los atributos de función GCC).  Pero eso es solo una variación del tema de las variables no estáticas;
mantiene la misma interpretación que tenía antes.

avatar de usuario

caballero Según la documentación de MSDN:

Al modificar una variable, la palabra clave static especifica que la variable tiene una duración estática (se asigna cuando comienza el programa y se desasigna cuando finaliza) y la inicializa en 0 a menos que se especifique otro valor.Al modificar una variable o función en el ámbito del archivo, la palabra clave estática especifica que la variable o función tiene un vínculo interno (su nombre no es visible desde fuera del archivo en el que se declara). Estática (C++) en MSDN

: Archivado en enero de 2015; consulte también la documentación más reciente:

estático § Clases de almacenamiento (C++) | Documentos de Microsoft

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad