Variables globales en ficheros .h

Iniciado por Kherom, 19 Enero 2012, 20:55 PM

0 Miembros y 1 Visitante están viendo este tema.

Kherom

Buenas, tengo un problema, he intentado declarar algunas variables globales en ficheros .h para accedera a ellas desde cualquier punto sin preocuparme de ellas, pero siempre me las intenta declarar varias veces y tira error pesar de que supuestamente sólo debería definir el fichero una vez ya que lo hago tal que así:

#ifndef LOQUESEA
#define LOQUESEA

//Declaraciones

#endif //LOQUESEA


¿Sabéis qué hago mal o si simplemente no se puede?

soyloqbuskas

Buenas Kherom !

Hasta donde yo se, no se puede hacer declaraciones de variables en las cabeceras (.h) de los programas. En las cabeceras solo estan los nombres de las funciones y procedimientos a las que otro modulo o clase puede llamar.

Si quieres crear una variable global para un modulo, deberas declararla en el .c fuera de cualquier funcion. Asi esa variable sera global para ese modulo.

Si lo que quieres hacer es crear una variable global para todos los modulos, creo que esto no se puede hacer.

De todas formas, no te recomiendo el uso de variables globales, ya que cuando una funcion f1() usa esa variable deja la variable con basura y si luego la funcion f2() la usa, puede que la funcion f2() no te muestre un resultado correcto. Asi que debes tener mucho cuidado con las variables globales.

Espero haberte servido de ayuda, un saludo.
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

Kherom

Creo que sí que se pueden hacer globales a todos los ficheros con extern, al menos en c++ se puede, en c creo que también. Por otro lado si dejo una variable como global es por que obviamente quiero compartir datos entre funciones, no voy a declarar el contador de una función como global xD (En mi caso la variable es un puntero con todos los datos de usuarios cargados desde un fichero, aunque también lo he usado para IDs, manejadores, etc)

rir3760

El problema se debe a la diferencia entre declaraciones y definiciones. Si necesitas de una variable "global" (técnicamente estas no existen en C, son una combinación de "file scope" y "external linkage") debes declarar la variable en el archivo de inclusión utilizando la palabra reservada "extern", por ejemplo:
/* Declaracion de la interfaz */

extern int x;


Esa variable la debes definir en una sola unidad (sin utilizar "extern") y, por supuesto, fuera de toda función:
int x;

De esa forma tienes la declaración de la variable en varias unidades (al incluir el encabezado) y sola una definición (en la unidad que lo requiera).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language