2012-04-27 3 views
6

tengo 2 archivos fuente (.c) denominados file1.c y file2.c que necesitan compartir entre ellos una variable, de modo que si en un archivo fuente la variable se ha actualizado, en el otro archivo fuente al acceder a este variable el cambio se verá.cómo compartir una variable y su valor entre muchos archivos fuente en lenguaje c?

lo que hice es crear otro archivo fuente llamada Archivo3.c y la cabecera de archivo llamado file3.h (que, por supuesto, se han incluido en Archivo2.c Archivo1.c y en Archivo3.c)

in file3.c: 

int myvariable = 0; 

void update(){//updating the variable 

    myvariable++; 

} 

int get(){//getting the variable 

    return myvariable; 

} 

in file3.h: 

extern int myvariable; 

void update(void); 

int get(void); 

in file1.c: 
. 
. 
. 
printf("myvariable = %d",get());//print 0 
update(); 
printf("myvariable = %d",get());//print 1 
. 
. 
. 

in file2.c: 
. 
. 
. 
printf("myvariable = %d",get());//print 0 but should print 1 
. 
. 
. 

pero el problema es cuando en file1.c actualización se invoca y se actualiza myvariable el cambio no se puede ver en file2.c porque en Archivo2.c cuando se invoca get y myvariable se imprime 0 se ha impreso, sólo si en Archivo2.c se invoca la actualización y luego se ve el cambio. parece que se comparte la variable pero para cada archivo fuente no es un valor variable de memoria distinto/diferente para esta variable

+0

¿Cómo compila estos archivos para crear el ejecutable? – dpp

+0

en file1.c y file2.c ¿declaras también "int myvariable;"? Usted no debe. –

+0

compilo con un archivo MAKE que me dio alguien y no, no los declaro en ningún archivo, solo en file3.c y en file3.h mientras escribía. –

Respuesta

3

Se puede declarar la variable como extern en los demás archivo cuando se necesita la variable ...

+0

Sí, eso se puede hacer, pero a menudo es mejor no crear muchas variables globales. Cree la variable para tener un alcance de archivo (estático) y proporcione funciones de acceso según sea necesario en ese archivo. El resto de la aplicación (de diferentes archivos y alcance) * tendrá * para usar las funciones de acceso a continuación. Usualmente conduce a un diseño más limpio y más fácil de depurar y mantener. – Chimera

2

incluyen file3.h en Archivo1.c y Archivo2.c

+0

ya lo hice como lo escribí "... llamado file3.h (que, por supuesto, se ha incluido en file1.c file2.c y en file3.c)" –

+0

lo siento puede parecer obvio, pero 'update' y 'get' tiene' int myvariable' dentro de la función? si no, podrías agregar el código de obtención y actualización. – keety

+0

void update (void) {myvariable ++; } int get (void) {return myvariable;} –

2

recomiendo para evitar extern variables debido a la confusión de código - repitiendo los externos en todos y cada archivo usando ese mundial. Por lo general, es mejor vincular la variable global a un alcance de archivo haciendo que sea static. Y luego para usar las funciones interface para acceder a él. En sus términos de ejemplo será:

// in file3.h 
void update(int x); 
int get(void); 

// in file3.c: 
static int myVariable = 0; 

void update(int x){ 
    myVariable = x; 
} 

int get(){ 
    return myVariable; 
} 

// in other files - include file3.h and use 
// update()/get() to access static variable 
+0

Tonterías. La declaración de la variable 'extern' pertenece correctamente en 'file3.h', que necesariamente se incluiría incluso con su método, que trata sobre el control de acceso. El desorden de código no es el problema aquí. – kittemon

+1

Mi método no expone la variable 'extern', solo dos funciones para leer/escribir en ella. A veces también es un buen enfoque. –

+0

0x69 - no funciona para mí. si invoco esta actualización (5) en file1.c y luego imprimí allí, se imprimirá 5. pero después de eso cuando invoco get() desde file2.c y lo imprimo, se imprime 0 y no 5 como me gustaría. –

2

Aquí hay una solución posible. Al hacer esto, la variable no es global para toda la aplicación y solo puede leerse/escribirse usando las funciones de acceso. Por favor hágame saber si tiene preguntas.

Archivos: access.c access.h file2.c main.c
compilar con: gcc main.c file2.c access.c -o test
Run: ./test

del archivo: main.c

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

int main(int argc, char *argv[]) 
{ 
    int value; 


    put(1); 
    printf("%d\n", get()); 

    put(getValue() + 1); 
    printf("%d\n", getValue()); 

    return(0); 
} 

del archivo: access.c

#include "access.h" 

static int variable = 0; 


int get(void) 
{ 
    return(variable); 
} 

void put(int i) 
{ 
    variable = i; 
    return; 
} 

del archivo: fichero2 .c

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


int getValue(void) 
{ 
    int i = get(); 

    printf("getValue:: %d\n", i); 

    put(++i); 
    printf("after getValue:: %d\n", get()); 
    return(i); 
} 

del archivo: access.h

extern int getValue(void); 
extern int get(void); 
extern void put(int i); 

Y aquí está la salida de ejecución:

[[email protected] SO]# ./test 
1 
getValue:: 1 
after getValue:: 2 
getValue:: 3 
after getValue:: 4 
4 

espero que esto ayude.

Cuestiones relacionadas