2010-10-01 24 views
6

Soy nuevo en la programación en C, así que estoy intentando muchas cosas diferentes para tratar de familiarizarme con el idioma.inicializando una variable estática en el encabezado

me escribió lo siguiente:

Archivo q7a.h:

static int err_code = 3; 
void printErrCode(void); 

Archivo q7a.c:

#include <stdio.h> 
#include "q7a.h" 

void printErrCode(void) 
{ 
     printf ("%d\n", err_code); 
} 

Archivo q7main.c:

#include "q7a.h" 

int main(void) 
{ 
     err_code = 5; 
     printErrCode(); 

     return 0; 
} 

que luego corrió lo siguiente en el archivo MAKE (estoy usando un sistema operativo Linux)

gcc –Wall –c q7a.c –o q7a.o 
gcc –Wall –c q7main.c –o q7main.o 
gcc q7main.o q7a.o –o q7 

la salida es 3.

Por qué sucede esto ?

Si inicializa una variable estática (de hecho cualquier variable) en el archivo de encabezado, entonces si 2 archivos incluyen el mismo archivo de encabezado (en este caso q7.c y q7main.c) el enlazador está destinado a dar un error para definir dos veces la misma var?

¿Y por qué no se inserta el valor 5 en la var estática (después de todo, es estático y global)?

Gracias por la ayuda.

+2

Solo una nota: nunca, en ninguna circunstancia, INICIE las variables en un archivo de encabezado. Es una práctica absolutamente incorrecta. Entiendo que lo estás haciendo ahora como un ejercicio de aprendizaje. –

+1

@ user82238, a menos que sea una constante estática, entonces tal vez. –

Respuesta

23

static significa que la variable solo se usa dentro de su compilación y no estará expuesta al enlazador, por lo que si tiene un static int en un archivo de cabecera e incluye dos archivos .c separados, tendrá dos discretos copias de ese int, que probablemente no sea lo que quieres.

En su lugar, puede considerar extern int, y elija un archivo .c que realmente lo defina (es decir, solo int err_code=3).

+1

¿No quiere decir * definir * en lugar de * declarar * en su última oración? – schot

+0

Sí. Corregido – EboMike

0

Las variables estáticas no tienen enlaces externos, lo que significa que no se puede acceder fuera de la unidad de traducción en la que se están definiendo. Entonces en su caso cuando q7.h es #incluido en ambas unidades de traducción q7a.c y q7main.c ... existen dos copias diferentes en sus correspondientes archivos .o. Es por eso que el vinculador no informa el error porque el enlazador no ve las dos copias mientras hace un enlace de símbolo externo.

0

Al hacer pequeñas investigaciones, llegamos a saber que podemos declarar una variable en el archivo de encabezado, pero en uno de los archivos fuente incluye que debería haber una definición para esa variable.

En cambio, si definimos una variable en el archivo de encabezado. en los archivos de origen donde se incluye este archivo de cabecera, se crearán definiciones que causan definiciones múltiples.

Una variable estática debe ser declarada en el archivo donde la usamos no debe estar expuesta al archivo de encabezado.

Espero que esté dando la información correcta. Si estoy equivocado, no dude en corregir mis declaraciones en sus comentarios.

Cuestiones relacionadas