variables globales compartidas en C

3 minutos de lectura

¿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 externs en la parte superior de todos los otros 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 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

avatar de usuario
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

avatar de usuario
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.

avatar de usuario
tritinia

Si está compartiendo código entre C y C++, recuerde agregar lo siguiente a la shared.hexpediente:

#ifdef __cplusplus
extern "C" {
#endif

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

#ifdef __cplusplus
}
#endif

avatar de usuario
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.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad