2010-11-25 10 views
8

I declaró una variable i en temp2.h extern i; que contiene sólo una encima de la línea e hizo otro archivo temp3.cadvertencia en la declaración extern

#include<stdio.h> 
#include<temp2.h> 
int main() 
{ 
extern i; 
i=6; 
printf("The i is %d",i); 
} 

Cuando he realizado anteriormente como cc -I ./ temp3.c Me siguiente errores

/tmp/ccJcwZyy.o: In function `main': 
temp3.c:(.text+0x6): undefined reference to `i' 
temp3.c:(.text+0x10): undefined reference to `i' 
collect2: ld returned 1 exit status 

Ya había declarado extern en temp3.c como dice KR en la página 33 como mencioné en la publicación anterior. Probé otra manera para temp3.c con misma cabecera del archivo temp2.h

#include<stdio.h> 
#include<temp2.h> 
int main() 
{ 

i=6; 
printf("The i is %d",i); 
} 

y compilé cc -I ./ temp3.c y obtuve siguiente error

/tmp/ccZZyGsL.o: In function `main': 
temp3.c:(.text+0x6): undefined reference to `i' 
temp3.c:(.text+0x10): undefined reference to `i' 
collect2: ld returned 1 exit status 

También probé

#include<stdio.h> 
#include<temp2.h> 
int main() 
{ 
extern i=6; 
printf("The i is %d",i); 
} 

compilado esta uno

cc -I ./ temp3.c 

tiene mismo error que en el post 1

temp3.c: In function ‘main’: 
temp3.c:5: error: ‘i’ has both ‘extern’ and initializer 

Así que han intentado al menos 3 formas diferentes de utilizar extern pero no de ellos trabajaron.

Respuesta

14

Cuando declara una variable usando extern, le está diciendo al compilador que la variable se definió en otro lugar y la definición se proporcionará en el momento del enlace. La inclusión es una cosa completamente diferente.

extern

una variable externa debe ser definido, exactamente una vez, fuera de cualquier función; esto deja de lado el almacenamiento para ello. La variable también debe declararse en cada función que quiera acceder a ella; esto indica el tipo de la variable. La declaración puede ser una declaración explícita externa o puede estar implícita a partir del contexto.

-El lenguaje de programación C

Una variable debe definirse una vez en uno de los módulos (en una de las unidades de traducción) del programa. Si no hay definición o más de uno, se produce un error, posiblemente en la etapa de vinculación (como en los ejemplos 1 y 2).

intentar algo así como lo siguiente

a.c

int i =10; //definition 

b.c

extern int i; //declaration 
int main() 
{ 
    printf("%d",i); 
} 

compilar, enlazar y crear un ejecutable usando

gcc a.c b.c -o executable_name 

o


gcc -c a.c // creates a.o 
gcc -c b.c // creates b.o 

Ahora enlazar los archivos objeto y crear un ejecutable

gcc a.o b.o -o executable_name 
2

extern es el mecanismo de declaración utilizado para indicar al compilador que la variable se define en otro archivo.

Mi sugerencia es que defina una variable en un archivo ".c" y luego agregue la declaración extern en el archivo ".h" correspondiente. De esta forma, la declaración de la variable estará disponible para todos los archivos fuente que incluyen este archivo de encabezado y también será más fácil para uno identificar en qué ".c" está realmente definido.

4

El primer programa dijo:

  • La variable i (implícitamente del tipo int) se define en otro lugar - pero no definió en cualquier lugar.

El segundo programa intentó usar una variable para la que no había ninguna declaración.

El tercer programa trató de declarar una variable sin un tipo explícito (solía ser bien; no se permite en C99), y dijo:

  • La variable i se define en otro lugar, pero yo quiero para inicializar aquí.

No tiene permitido hacer eso.

Por lo tanto, el compilador es correcto en todos los casos.


La declaración en el 'temp2.h' cabecera debe fijarse a extern int i; primero. El int implícito es obsoleto.

Se podría fijar el primer ejemplo de varias formas:

#include <stdio.h> 
#include <temp2.h> 
int main() 
{ 
    extern int i; 
    i=6; 
    printf("The i is %d",i); 
    return 0; 
} 

int i; 

Esto define la variable después de la función - aconventional pero legítimo. Alternativamente, podría estar en un archivo fuente separado que se compilará por separado y luego se vinculará con el programa principal.

El segundo ejemplo podría ser fijado con:

#include <stdio.h> 
#include <temp2.h> 
int main() 
{ 
    int i=6; 
    printf("The i is %d",i); 
    return 0; 
} 

Es importante tener en cuenta que este ejemplo tiene ahora dos variables llamadas i; el declarado en temp2.h (pero en realidad no se hace referencia en ninguna parte), y el que se define en main(). Otra forma de corregirlo es la misma que en la primera solución posible:

#include <stdio.h> 
#include <temp2.h> 
int main() 
{ 
    i=6; 
    printf("The i is %d",i); 
    return 0; 
} 

int i; 

Nuevamente, colocación convencional, pero legítima.

La tercera uno se puede fijar por métodos similares a los dos primeros, o esta variante:

#include <stdio.h> 
#include <temp2.h> 
int i; 
int main() 
{ 
extern int i; 
i=6; 
printf("The i is %d",i); 
return 0; 
} 

Esto todavía declara i en <temp2.h> pero lo define en el archivo de fuente que contiene main() (convencionalmente colocado - en el parte superior del archivo). El interior de extern int i;main() es doblemente redundante: la definición en el archivo de origen y la declaración en el encabezado significan que no necesita ser redeclarado dentro de main(). Tenga en cuenta que, en general, la declaración en el encabezado y la definición en el archivo fuente no son redundantes; la declaración en el encabezado proporciona una verificación de coherencia con la definición, y los otros archivos que también usan la variable y el encabezado tienen la seguridad de que la definición en el archivo que contiene main() es equivalente a la definición que el otro archivo está usando también.

+0

Quiero que esta variable esté también disponible en muchos otros archivos. Lo que haré y el valor si se cambia en un archivo por cualquier llamada de función, entonces otro módulo o programa que pueda estar usando debería obtener el valor cambiado. Así que quiero que la variable sea global para todos los módulos. Hasta su mensaje, no tenía idea de cómo funciona el externo. Pensé que el externo es una forma de hacer que una variable sea global. –

+1

@Bond: hace que la variable sea global al definirla fuera de cualquier función en un archivo fuente, y al declararla en el encabezado y usar el encabezado en cada archivo fuente que necesita usar la variable. También incluye el encabezado en el archivo que define la variable para garantizar que la definición y la declaración sean consistentes. Entonces, declararlo ('extern int i; ') en el encabezado; defínalo una vez, probablemente en el archivo con 'main()' ('int i = 0;'). Evitar definiciones tentativas y definiciones comunes; no son completamente portátiles. Ver también [SO 1433204] (http://stackoverflow.com/questions/1433204/). –

Cuestiones relacionadas