¿Cómo comparto variables entre diferentes archivos .c?

pregunta para principiantes sobre la statement C:

En un archivo .c, ¿cómo usar las variables definidas en otro archivo .c?

En archivoA.c:

int myGlobal = 0; 

En fileA.h

 extern int myGlobal; 

En archivoB.c:

 #include "fileA.h" myGlobal = 1; 

Así que así es como funciona:

  • la variable vive en fileA.c
  • fileA.h le dice al mundo que existe y cuál es su tipo ( int )
  • fileB.c incluye fileA.h para que el comstackdor conozca myGlobal antes de que fileB.c intente usarlo.
  1. Intenta evitar los globals. Si debe usar un global, vea las otras respuestas.
  2. Pasarlo como argumento a una función.

si la variable es:

 int foo; 

en el segundo archivo C declaras:

 extern int foo; 

En el 99.9% de todos los casos, es un mal diseño del progtwig compartir variables globales no constantes entre archivos. Hay muy pocos casos en los que realmente necesite hacer esto: son tan raros que no puedo encontrar ningún caso válido. Declaraciones de registros de hardware tal vez.

En la mayoría de los casos, debe usar las funciones setter / getter (“públicas”) (posiblemente en línea), las variables estáticas en el scope del archivo (“privado”) o las implementaciones de tipo incompletas (“privadas”).

En los pocos casos en los que necesite compartir una variable entre archivos, haga lo siguiente:

 // file.h extern int my_var; // file.c #include "file.h" int my_var = something; // main.c #include "file.h" use(my_var); 

Nunca coloque ningún tipo de definición de variable en un archivo h.

Esas otras variables tendrían que declararse públicas (use extern, public es para C ++), y tendría que incluir ese archivo .c. Sin embargo, recomiendo crear archivos .h apropiados para definir todas sus variables.

Por ejemplo, para hello.c, tendría un hello.h y hello.h almacenaría sus definiciones de variable. Luego, otro archivo .c, como world.c, tendría este fragmento de código en la parte superior:

 #include "hello.h" 

Eso permitirá que world.c use variables definidas en hello.h

Aunque es un poco más complicado que eso. Puede usar <> para incluir archivos de biblioteca encontrados en la ruta de su sistema operativo. Como principiante, pegaría todos tus archivos en la misma carpeta y usaría la sintaxis “”.

El segundo archivo necesita saber sobre la existencia de tu variable. Para hacer esto, declara la variable nuevamente, pero usa la palabra clave extern en frente de ella. Esto le dice al comstackdor que la variable está disponible pero se ha declarado en otro lugar, por lo que no se puede crear una instancia (lo que causaría conflictos al vincular). Si bien puede colocar la statement extern en el archivo C, es un estilo común tener un archivo de encabezado adjunto (es decir, .h ) para cada archivo .c que proporciona funciones o variables a otros que contienen la statement extern . De esta forma evitará copiar la statement extern , especialmente si se usa en muchos otros archivos. Lo mismo se aplica a las funciones, aunque no necesita la palabra clave extern para ellas.

De esta forma, tendría al menos tres archivos: el archivo fuente que declara la variable, el encabezado que hace la statement extern y el segundo archivo fuente que #include el encabezado para obtener acceso a la variable exportada (o cualquier otro símbolo exportado) en el encabezado). Por supuesto, necesita todos los archivos de origen (o los archivos de objeto apropiados) cuando intenta vincular algo así, ya que el vinculador debe resolver el símbolo, que solo es posible si realmente existe en los archivos vinculados.