¿Cómo puedo crear variables globales que se comparten en C? Si lo coloco en un archivo de encabezado, el enlazador 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 ponerla manualmente extern
s en la parte superior de todos los otros archivos C que quieren usarlo? Eso no suena ideal.
variables globales compartidas en C
Hernan
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 todas sus unidades de compilación (por ejemplo: shared.cpp) :
/* shared.cpp */
#include "shared.h"
int this_is_global;
-
¿Tiene alguna referencia preferida para obtener más información sobre los mecanismos de IPC?
– NickO
10 de febrero de 2013 a las 23:03
-
Por favor, ponga más énfasis en “solo una declaración de su símbolo global…” Un poco tropezado con eso. Tenía la declaración en todos los archivos c en los que quería usar las variables globales 🙁
– AntonioCS
27 de diciembre de 2013 a las 0:21
Cavar
En el archivo de encabezado escríbalo con extern
. Y en el ámbito global de uno de los archivos c declararlo sin extern
.
-
¿Podemos declararlo en el archivo de encabezado de ese archivo *.c?
– Geremia
29 de enero de 2016 a las 17:39
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 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 cur
– claudio
10 de junio de 2010 a las 4:03
Pones la declaración en un archivo de encabezado, por ejemplo
extern int my_global;
En uno de sus archivos .c, lo define en el ámbito global.
int my_global;
Cada archivo .c al que desee acceder my_global
incluye el archivo de cabecera con el extern
en.
tritinia
Si está compartiendo código entre C y C++, recuerde agregar lo siguiente a la shared.h
expediente:
#ifdef __cplusplus
extern "C" {
#endif
extern int my_global;
/* other extern declarations ... */
#ifdef __cplusplus
}
#endif
iván
Hay una forma 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, prefije cada declaración con una palabra clave (uso común), luego en solo un 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 enlazador aún se quejará porque 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 utilice la palabra clave común en #define.
¿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 compartir datos entre procesos, utilice mecanismos IPC (memoria compartida, conductos).
– Hernan
9 de junio de 2010 a las 23:15
Véase también ¿Qué son
extern
variables en C?–Jonathan Leffler
20 mayo 2013 a las 15:39
posible duplicado de ¿Cómo comparto variables entre diferentes archivos .c?
– 7hi4g0
3 de junio de 2015 a las 6:16
Posible duplicado de ¿Cómo uso extern para compartir variables entre archivos fuente en C?
– jww
18 de febrero de 2017 a las 20:46