2010-06-09 22 views
71

Come posso creare variabili globali condivise in C? Se lo metto in un file di intestazione, il linker si lamenta che le variabili sono già definite. È l'unico modo per dichiarare la variabile in uno dei miei file C e inserire manualmente extern s nella parte superiore di tutti gli altri file C che vogliono usarlo? Non suona ideale.variabili globali condivise in C

+0

Condiviso con il proprio codice sorgente? Metti la dichiarazione extern in un file di intestazione e la definizione in un'altra fonte (singola). Quelli sono condivisi tra i thread del processo, naturalmente. Per la condivisione interprocesso dei dati, utilizzare i meccanismi IPC (memoria condivisa, pipe). –

+1

Vedere anche [Quali sono le variabili 'extern' in C?] (Http://stackoverflow.com/questions/1433204/what-are-extern-variables-in-c/1433387#1433387) –

+2

possibile duplicato di [Come fare Condivido le variabili tra diversi file .c?] (Http://stackoverflow.com/questions/1045501/how-do-i-share-variables-between-different-c-files) – 7hi4g0

risposta

55

Nel file di intestazione scrivilo con extern. E nell'ambito globale di uno dei file c lo dichiariamo senza extern.

+0

Possiamo dichiararlo invece nel file di intestazione del file * .c? – Geremia

81

In un file di intestazione (shared.h):

extern int this_is_global; 

In ogni file che si desidera utilizzare questo simbolo globale, includere intestazione contenente la dichiarazione extern:

#include "shared.h" 

Per evitare multipla definizioni linker, solo una dichiarazione di vostro simbolo globale devono essere presenti attraverso i vostri unità di compilazione (ad es: shared.cpp):

/* shared.cpp */ 
#include "shared.h" 
int this_is_global; 
+0

hai qualche riferimento preferito per saperne di più sui meccanismi IPC? – NickO

+6

Per favore metti più enfasi su "una sola dichiarazione del tuo simbolo globale ..." Tipo di intervento su quello. Ho avuto la dichiarazione su tutti i file c che volevo usare le variabili globali su :( – AntonioCS

14

Hai inserito la dichiarazione in un file di intestazione, ad es.

extern int my_global; 

In uno dei file .c lo si definisce a livello globale.

int my_global; 

Ogni file .c che vuole l'accesso al my_global include il file di intestazione con il extern in.

21

Nel file di intestazione

file di intestazione

#ifndef SHAREFILE_INCLUDED 
#define SHAREFILE_INCLUDED 
#ifdef MAIN_FILE 
int global; 
#else 
extern int global; 
#endif 
#endif 

Nel file con il file che si desidera che la vita globale:

#define MAIN_FILE 
#include "share.h" 

Negli altri file che devono la versione extern:

#include "share.h" 
+0

ah questa è la soluzione che avevo da un po 'di tempo - ho dimenticato la variabile del preprocessore MAIN_FILE. – Claudiu

4

Se stai condividendo codice tra C e C++, ricordarsi di aggiungere il seguente al file shared.h:

#ifdef __cplusplus 
extern "C" { 
#endif 

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

#ifdef __cplusplus 
} 
#endif 
1

Ci è un modo più pulito con un solo file di intestazione, quindi è più semplice da mantenere. Nell'intestazione con le variabili globali precedere ogni dichiarazione con una parola chiave (io uso comune), allora in un solo file sorgente comprendono come questo

#define common 
#include "globals.h" 
#undef common 

e qualsiasi altro file di origine come questo

#define common extern 
#include "globals.h" 
#undef common 

Assicurati solo di non inizializzare nessuna delle variabili nel file globals.h o il linker continuerà a lamentarsi poiché una variabile inizializzata non viene considerata esterna anche con la parola chiave extern. Il globale.Il file h è simile a questo

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

sembra funzionare per qualsiasi tipo di dichiarazione. Non utilizzare la parola chiave comune su #define, naturalmente.