¿Por qué el enlace externo no se vincula a una variable estática?
⏰ 4 minutos de lectura
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?
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:
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.
extern int blah; — blah debe definirse en otro lugar y se hace referencia a él desde este archivo.
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.
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!
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