2010-06-09 41 views
71

¿Cómo puedo crear variables globales que se comparten en C? Si lo pongo en un archivo de encabezado, el enlazador se queja de que las variables ya están definidas. ¿Es la única manera de declarar la variable en uno de mis archivos C y poner manualmente en extern s en la parte superior de todos los otros archivos C que desean usarlo? Eso suena no ideal.variables globales compartidas en C

+0

¿Compartido dentro de su propio código fuente? Coloque la declaración extern en un archivo de encabezado y la definición en otra fuente (única). Esos son compartidos entre sus hilos de proceso, por supuesto. Para el intercambio de datos entre procesos, use los mecanismos de IPC (memoria compartida, tuberías). –

+1

Ver también [¿Qué son las variables 'extern' en C?] (Http://stackoverflow.com/questions/1433204/what-are-extern-variables-in-c/1433387#1433387) –

+2

posible duplicado de [¿Cómo hacer? ¿Comparto variables entre diferentes archivos .c?] (Http://stackoverflow.com/questions/1045501/how-do-i-share-variables-between-different-c-files) – 7hi4g0

Respuesta

55

En el archivo de encabezado, escríbalo con extern. Y en el alcance global de uno de los archivos c lo declara sin extern.

+0

¿Podemos declararlo en el archivo de encabezado del archivo * .c? – Geremia

81

En un archivo de cabecera (SHARED.H):

extern int this_is_global; 

En todos los archivos que desea utilizar este símbolo mundial, incluir un encabezado que contiene la declaración extern:

#include "shared.h" 

Para evitar múltiples definiciones de enlazador, solo una declaración de su símbolo global debe estar presente en todas sus unidades de compilación (p. ej .: shared.cpp):

/* shared.cpp */ 
#include "shared.h" 
int this_is_global; 
+0

¿Tiene alguna referencia preferida para aprender más sobre los mecanismos de IPC? – NickO

+6

Por favor ponga más énfasis en "solo una declaración de su símbolo global ..." Tipo de tropezó en eso. Tuve la declaración en todos los archivos c que quería utilizar las variables globales en :( – AntonioCS

14

Pones la declaración en un archivo de cabecera, p.

extern int my_global; 

En uno de sus archivos .c lo define como de alcance global.

int my_global; 

Cada archivo .c que quiere tener acceso a my_global incluye el fichero de cabecera con el extern en.

21

En el archivo de cabecera

archivo de cabecera

#ifndef SHAREFILE_INCLUDED 
#define SHAREFILE_INCLUDED 
#ifdef MAIN_FILE 
int global; 
#else 
extern int global; 
#endif 
#endif 

En el archivo con el archivo que desea que el mundo en vivo:

#define MAIN_FILE 
#include "share.h" 

En los otros archivos que necesitan la versión extern:

#include "share.h" 
+0

ah esta es la solución que tuve hace un tiempo - me olvidé de la variable de preprocesador MAIN_FILE. Me gusta la respuesta cur aceptada más tarde – Claudiu

4

Si va a compartir código entre C y C++, recuerde que debe añadir lo siguiente en el archivo shared.h:

#ifdef __cplusplus 
extern "C" { 
#endif 

extern int my_global; 
/* other extern declarations ... */ 

#ifdef __cplusplus 
} 
#endif 
1

Hay es una forma más limpia con solo un archivo de encabezado por lo que es más fácil de mantener. En la cabecera con las variables globales prefijo de cada declaración con una palabra clave (yo uso común), entonces en un solo archivo fuente incluirla como esto

#define common 
#include "globals.h" 
#undef common 

y cualquier otro archivo de origen como esto

#define common extern 
#include "globals.h" 
#undef common 

Solo asegúrese de no inicializar ninguna de las variables en el archivo globals.h o el enlazador aún se quejará porque una variable inicializada no se trata como externa incluso con la palabra clave extern. Lo global.h archivo se parece a esto

#pragma once 
common int globala; 
common int globalb; 
etc. 

parece funcionar para cualquier tipo de declaración. No use la palabra clave común en #define, por supuesto.