¿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 extern
s en la parte superior de todos los demás archivos C que quieren usarlo? Eso no suena ideal.
82
extern
variables en C?Respuestas:
En el archivo de encabezado, escríbalo con
extern
. Y en el ámbito global de uno de los archivos c, declararlo sinextern
.fuente
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;
fuente
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"
fuente
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_global
incluye el archivo de encabezado con la extensiónextern
in.fuente
Si está compartiendo código entre C y C ++, recuerde agregar lo siguiente al
shared.h
archivo:#ifdef __cplusplus extern "C" { #endif extern int my_global; /* other extern declarations ... */ #ifdef __cplusplus } #endif
fuente
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.
fuente