variables globales compartidas en C


82

¿Cómo puedo crear variables globales que se comparten en C? Si lo coloco en un archivo de encabezado, el vinculador se queja de que las variables ya están definidas. ¿Es la única forma de declarar la variable en uno de mis archivos C y poner manualmente externs en la parte superior de todos los demás archivos C que quieren usarlo? Eso no suena ideal.


¿Compartido dentro de su propio código fuente? Coloque la declaración externa en un archivo de encabezado y la definición en otra fuente (única). Esos se comparten entre los hilos de su proceso, por supuesto. Para el intercambio de datos entre procesos, utilice mecanismos IPC (memoria compartida, canalizaciones).
Hernán



Respuestas:


63

En el archivo de encabezado, escríbalo con extern. Y en el ámbito global de uno de los archivos c, declararlo sin extern.


1
¿Podemos declararlo en el archivo de encabezado de ese archivo * .c?
Geremia

91

En un archivo de encabezado (shared.h):

extern int this_is_global;

En cada archivo que desee usar este símbolo global, incluya un encabezado que contenga la declaración externa:

#include "shared.h"

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

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

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

7
Por favor, ponga más énfasis en "una sola declaración de su símbolo global ...". Tenía la declaración en todos los archivos c en los que quería usar las variables globales :(
AntonioCS

22

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

#define MAIN_FILE
#include "share.h"

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

#include "share.h"

Ah, esta es la solución que tuve hace un tiempo: me olvidé de la variable de preprocesador MAIN_FILE. Creo que me gusta más la respuesta aceptada por el perro aunque
Claudiu

15

Pones la declaración en un archivo de encabezado, por ejemplo

 extern int my_global;

En uno de sus archivos .c, lo define a nivel global.

int my_global;

Cada archivo .c al que desea acceder my_globalincluye el archivo de encabezado con la extensión externin.


5

Si está compartiendo código entre C y C ++, recuerde agregar lo siguiente al shared.harchivo:

#ifdef __cplusplus
extern "C" {
#endif

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

#ifdef __cplusplus
}
#endif

2

Hay una forma más limpia con un solo archivo de encabezado, por lo que es más fácil de mantener. En el encabezado con las variables globales, coloque el prefijo de cada declaración con una palabra clave (yo uso común) y luego, en un solo archivo fuente, inclúyalo así

#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 vinculador seguirá quejándose ya que una variable inicializada no se trata como externa incluso con la palabra clave extern. El archivo global.h se parece a esto

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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.