variables globales compartidas en C

¿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 extern en forma manual en la parte superior de todos los otros archivos C que desean usarla? Eso suena no ideal.

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

En un archivo de encabezado (shared.h):

 extern int this_is_global; 

En cada archivo que desee utilizar este símbolo global, incluya un encabezado que contenga la statement extern:

 #include "shared.h" 

Para evitar múltiples definiciones de enlazador, solo una statement de su símbolo global debe estar presente en todas sus unidades de comstackción (por ejemplo: shared.cpp):

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

En el archivo de encabezado

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 viva:

 #define MAIN_FILE #include "share.h" 

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

 #include "share.h" 

Pones la statement en un archivo de cabecera, por ejemplo

  extern int my_global; 

En uno de sus archivos .c lo define en el scope global.

 int my_global; 

Cada archivo .c que quiera acceder a my_global incluye el archivo de encabezado con el extern in.

Si comparte código entre C y C ++, recuerde agregar lo siguiente al archivo shared.h :

 #ifdef __cplusplus extern "C" { #endif extern int my_global; /* other extern declarations ... */ #ifdef __cplusplus } #endif 

Hay una manera más limpia con solo un archivo de encabezado por lo que es más fácil de mantener. En el encabezado con las variables globales, prefija cada statement con una palabra clave (uso común) y luego en un solo archivo fuente, inclúyalo como este

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

y cualquier otro archivo fuente como este

 #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. El archivo global.h es similar a este

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

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