why used programming meaning functions bss are c variables linker global-variables scope

used - variables globales compartidas en C



static in programming (6)

¿Cómo puedo crear variables globales que se comparten en C? Si lo pongo en un archivo de encabezado, el enlazador se queja de que las variables ya están definidas. ¿Es la única manera de declarar la variable en uno de mis archivos C y poner extern en forma manual en la parte superior de todos los otros archivos C que desean usarla? Eso suena no ideal.


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

#define MAIN_FILE #include "share.h"

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

#include "share.h"


En el archivo de encabezado, escríbalo con extern . Y en el alcance global de uno de los archivos c lo declara sin extern .


En un archivo de encabezado (shared.h):

extern int this_is_global;

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

#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;


Hay una manera 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, prefija cada declaración con una palabra clave (uso común) y luego en un solo archivo fuente, inclúyalo como este

#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 es similar a este

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

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


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

extern int my_global;

En uno de sus archivos .c lo define en el alcance global.

int my_global;

Cada archivo .c que quiera acceder a my_global incluye el archivo de encabezado con el extern in.


Si comparte código entre C y C ++, recuerde agregar lo siguiente al archivo shared.h :

#ifdef __cplusplus extern "C" { #endif extern int my_global; /* other extern declarations ... */ #ifdef __cplusplus } #endif