2011-11-14 13 views
5
#include<stdio.h> 
int x=13; // forcing space allocation 
int x; 
int main(){ 
    printf("%d\n",x); 
} 

El código anterior compila pero el siguiente no. por qué ?Error: redeclaración sin vinculación

#include<stdio.h> 
int main(){ 
    int x=13; // forcing space allocation 
    int x; 
    printf("%d\n",x); 
} 

me dijeron que int x; puede ser interpretado por el compilador como una declaración o definición dependiendo del contexto. Puedo ver eso en el primer caso (global) pero lo que sucede en el segundo.

Respuesta

4

Quoting:

No se puede tener dos variables globales con el mismo nombre en el programa C. C podría permitir múltiples definiciones en el mismo alcance de archivo a través del tentative definition rule, pero en cualquier caso todas las definiciones se referirán a a la misma variable.

+0

Estoy de acuerdo con lo que dices. Pero ¿por qué no se aplica lo mismo a las variables locales? Creo que me estoy perdiendo algo muy obvio. Señale en la dirección correcta – Bazooka

+0

puede tener una definición tentativa solo para las variables que tienen alcance de archivo y no para las variables locales. –

0

Porque no puede declarar dos veces una variable local con el mismo nombre. Simplemente no hagas eso.

Funciona para el global, como el compilador lo ve como forward declaration, que por supuesto no puede trabajar con las variables de la pila.

Tenga en cuenta que solo puede funcionar globalmente cuando no se asigna ningún valor.

+1

Funciona para las variables globales. ¿Por qué no para los tipos automáticos? – Bazooka

+0

¿Cómo se llama un tipo automático? – Macmade

+0

Ver la edición ... – Macmade

0

Continuando desde su comentario: "puede explicar en mayor detalle las declaraciones adelantadas" ...

declaraciones

Adelante son exactamente lo que suenan. Una declaración que se definirá en otro lugar (generalmente más adelante). Este concepto solo se aplica a símbolos globales. Solo puede haber UNA definición de símbolo global dentro de un binario resultante. Sin embargo, puede declararlos una y otra vez dentro del código fuente para que puedan ser referenciados durante la fase de compilación.

Estos símbolos se convierten en definiciones en el ensamblaje que luego se utilizan para vincular todo junto durante la fase de vinculación.

Los archivos de encabezado son ejemplos de uso común de declaraciones directas que se definen en otro lugar (más adelante) en el código.

Las variables locales (automáticas) no se convierten en símbolos. Así, cuando decimos algo así como

int x; 
int x; 

dentro del mismo ámbito que el compilador no lo permite, ya que no tiene sentido. Las variables locales son simplemente una conveniencia para señalar a una ubicación particular dentro del marco de pila de la función. Su límite de definición está dentro de los marcadores de alcance {}.

Los archivos de encabezado son esencialmente "declaraciones directas" de variables y funciones globales; para ver esto para su como en struct foo;.

Si desea ver la definición global causar errores, intente. int x = 10;int x = 11; como global, y verá que el compilador escupe un error con el efecto "redifinción de x".