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.

Claudiu
fuente
¿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
1
Consulte también ¿Qué son las externvariables en C?
Jonathan Leffler

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.

DiGMi
fuente
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;
Hernán
fuente
¿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"
jim mcnamara
fuente
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.

nos
fuente
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
tritinia
fuente
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.

ivan
fuente