Estático vs global

4 minutos de lectura

avatar de usuario
Vijay

Si tengo un archivo C como el siguiente, ¿cuál es la diferencia entre i y j?

#include <stdio.h>
#include <stdlib.h>

static int i;
int j;

int main ()
{
    //Some implementation
}

  • Lea las respuestas a esta pregunta: stackoverflow.com/questions/1358400/…

    – Avakar

    16 de febrero de 2010 a las 9:56

  • Diferencia entre variable estática, automática, global y local en el contexto de c y c++

    – phuclv

    6 de julio de 2017 a las 16:38


i tiene un enlace interno, por lo que no puede usar el nombre i en otros archivos fuente (estrictamente unidades de traducción) para referirse al mismo objeto.

j tiene un enlace externo para que pueda usar j para referirse a este objeto si lo declaras extern en otra unidad de traducción.

  • no debería haber una diferencia de tiempo de ejecución si está haciendo lo mismo, ya que el compilador podría generar el mismo código. Sin embargo, la compilación puede ser un poco más larga con un global, ya que tiene un alcance más amplio.

    – Florián Castellane

    25 de octubre de 2016 a las 8:14

  • ¿Es posible determinar mediante programación el enlace de cualquier variable arbitraria en tiempo de compilación (potencialmente usando la extensión del compilador) o en tiempo de ejecución? Consulte: stackoverflow.com/q/65520719/9881330.

    – pmor

    7 de enero de 2021 a las 21:27


  • ¿Por qué necesito usar “extern” para declarar “j”? ¿Significa esto que “int j;” es una definición y no una declaración?

    – Abdel Alem

    5 de agosto de 2021 a las 13:14


avatar de usuario
Wallyk

i no es visible fuera del módulo; j es accesible a nivel mundial.

Es decir, otro módulo, que está vinculado a él, puede hacer

extern int j;

y luego ser capaz de leer y escribir el valor en j. El mismo otro módulo no puede acceder ipero podría declarar su propia instancia, incluso una global, que no es visible para el primer módulo.

  • ¿Es necesaria la declaración ‘externa’?

    – Thomas Matthews

    16 de febrero de 2010 a las 18:32

  • Depende de la implementación. Uso de extern está garantizado que no causará problemas, siempre que un módulo tenga el símbolo como noextern y público (que lo asigna). Las primeras implementaciones de Unix fusionaron símbolos con el mismo nombre, muy parecido a un común de Fortran, por lo que extern no fue requerido.

    – Wallyk

    16 de febrero de 2010 a las 19:21

  • Tenga en cuenta que “No visible” no significa que esté fuera del alcance. Eso significa que si declarara una i en una unidad de compilación diferente y eliminara la i estática de su archivo .c, la i global sería visible para su archivo .c. Por el contrario, si la i global estuviera fuera del alcance, no importaría si tuviera una i estática declarada en su archivo .c. El global nunca sería visible. la i estática que tiene prioridad sobre una i global definida en otra unidad de compilación se denomina “sombreado”. También sucede con las funciones locales y no es algo exclusivo de c++/c.

    – Júpiter

    4 sep 2013 a las 14:23

la diferencia es que i tiene enlace interno, y j tiene vinculación externa. Esto significa que puede acceder j de otros archivos con los que se vincula, mientras que i sólo está disponible en el archivo donde se declara.

avatar de usuario
Ramakrishna

i tendrá enlace estáticoes decir, solo se puede acceder a la variable en el archivo actual.

j debe definirse como externes decir

extern int j;

en otro archivo de encabezado (.h), y luego tendrá enlace externoy se puede acceder a través de archivos.

avatar de usuario
Sravya

El alcance de la variable/función estática está dentro del mismo archivo a pesar de que incluye el archivo como parte de un archivo fuente diferente.

El alcance de la variable global es en todos los archivos en los que se incluye. Para incluir la variable en un archivo fuente diferente, usamos extern antes de la declaración de la variable. No se vuelve a asignar memoria para la variable en este caso.

extern se utiliza para declarar una variable C sin definirla. extern La palabra clave amplía la visibilidad de las variables y funciones de C. Dado que las funciones son visibles en todo el programa de forma predeterminada, el uso de extern no es necesario en la declaración/definición de funciones. Su uso es redundante.

¿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