2011-06-11 17 views
7

que escribí siguiente programa¿por qué el trabajo siguiendo el programa

#include<stdio.h> 
main() 
{ 
     extern int i; 
     printf("\n%d",i); 
} 
int i=30; 

que estaba esperando un mensaje de error como i se inicializa después de la principal, pero por el contrario el programa me dio output.Why no me dio un error es qué quiero saber.

+0

¿Por qué le daría un error? – Marcin

Respuesta

8

Debido a que el símbolo que representa i es todavía presente en el espacio del programa. Al declararlo "externo", le está diciendo al compilador que NO espere necesariamente la definición de "yo" antes de encontrarlo ... en otras palabras, le está diciendo explícitamente al compilador que confíe en que el símbolo se vinculará más tarde. .

Esto, fundamentalmente, no es diferente de tener una definición de función en una biblioteca completamente separada y declararla externa en su main. El orden no es importante, como el símbolo todavía estará vinculada en.

+1

+1 Bien explicado. –

21

Todo el propósito de extern es que se dice que "no es una variable de tipo int llamada i, en alguna parte en el proyecto, que puede estar vinculado en adelante. Acaba de asumir que existe".

Puede definir i en un archivo .c completamente separado y aún funcionará siempre que vincule los archivos .o. Eso es lo que extern hace.

Es como la forma en que puede declarar una función y usarla, incluso si está definida en un archivo .c completamente independiente (o, de hecho, más adelante en la misma).

Lea el capítulo en su libro C sobre extern.

+1

Subí solo por la última línea en tu respuesta –

+0

@Eknath: Heh gracias; p –

+0

Eso es lo único que aprendí durante el día ...: D (Principiante en C) – Anonymous

3

Un extern es algo que se define externamente al módulo actual. Podría usar extern en caso de que su declaración venga más tarde, o incluso cuando su declaración esté en algún otro archivo, aún no encontrada.

[AHORRÁNDOLE ESFUERZO -> líneas de abajo son de Wikipedia]

Cuando se define una variable, le está diciendo al compilador para asignar memoria para esa variable, y posiblemente también para inicializar su contenido a un cierto valor.

Cuando declara una variable, le está diciendo al compilador que la variable se definió en otro lugar.

Usted le está diciendo al compilador que existe una variable con ese nombre y tipo, pero el compilador no debe asignarle memoria, ya que se realiza en otro lugar.

La palabra clave extern significa "declarar sin definir". En otras palabras, es una manera de declarar explícitamente una variable, o forzar una declaración sin definición.

Leer más: http://wiki.answers.com/Q/What_is_the_use_of_extern_in_C#ixzz1OzrWVmAC

1

que estaba esperando un mensaje de error como i se inicializa después de b principal

Las variables globales (como todas las variables con la duración de almacenamiento estático) se inician antes de que el código en main() comience a ejecutarse independientemente de en qué parte del código los haya definido.

+0

Sospecho que en realidad se refería a declarado definido en lugar de específicamente inicializado. Por supuesto, sin embargo, tienes razón. –

3

Si desea un análisis más profundo sobre cómo se accede desde la fuente principal y cuándo se inicializa, puede ver el resultado del conjunto de muestra. Como se señala en el comentario a continuación, es de una cadena de herramientas (gcc/linux), pero debería ayudar a dar una buena imagen. Muestra que estoy en el segmento de datos e inicializado antes de ejecutar main.

.file "test.c" 
    .section .rodata 
.LC0: 
    .string "\n%d" 
    .text 
.globl main 
    .type main, @function 
main: 
    pushl %ebp 
    movl %esp, %ebp 
    andl $-16, %esp 
    subl $16, %esp 
    movl i, %edx 
    movl $.LC0, %eax 
    movl %edx, 4(%esp) 
    movl %eax, (%esp) 
    call printf 
    leave 
    ret 
    .size main, .-main 
.globl i 
    .data 
    .align 4 
    .type i, @object 
    .size i, 4 
i: 
    .long 30 
    .ident "GCC: (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2" 
    .section .note.GNU-stack,"",@progbits 
+0

La salida de ensamblaje de una ejecución de una cadena de herramientas no es lo mismo que una garantía del estándar. Pero, aún así, bien investigado ... –

Cuestiones relacionadas