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
}
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
}
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
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 i
pero 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.
Ramakrishna
i
tendrá enlace estáticoes decir, solo se puede acceder a la variable en el archivo actual.
j
debe definirse como extern
es decir
extern int j;
en otro archivo de encabezado (.h
), y luego tendrá enlace externoy se puede acceder a través de archivos.
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.
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