web-dev-qa-db-fra.com

variables globales partagées en C

Comment créer des variables globales partagées en C? Si je le mets dans un fichier d'en-tête, l'éditeur de liens se plaint que les variables sont déjà définies. Est-ce que la seule façon de déclarer la variable dans l'un de mes fichiers C et de placer manuellement externs en haut de tous les autres fichiers C qui veulent l'utiliser? Cela ne semble pas idéal.

76
Claudiu

Dans le fichier d'en-tête, écrivez-le avec extern. Et à la portée globale de l'un des fichiers c, déclarez-le sans extern.

57
DiGMi

Dans un fichier d'en-tête (shared.h):

extern int this_is_global;

Dans chaque fichier pour lequel vous souhaitez utiliser ce symbole global, incluez un en-tête contenant la déclaration extern:

#include "shared.h"

Pour éviter plusieurs définitions d’éditeur de liens, ne seule déclaration de votre symbole global doit être présente sur toutes vos unités de compilation (par exemple: shared.cpp):

/* shared.cpp */
#include "shared.h"
int this_is_global;
87
Hernán

Dans le fichier d'en-tête

en tête de fichier

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

Dans le fichier contenant le fichier, vous voulez que le global vive:

#define MAIN_FILE
#include "share.h"

Dans les autres fichiers nécessitant la version externe:

#include "share.h"
22
jim mcnamara

Vous placez la déclaration dans un fichier d'en-tête, par exemple.

 extern int my_global;

Dans l'un de vos fichiers .c, vous le définissez au niveau global.

int my_global;

Chaque fichier .c qui veut accéder à my_global inclut le fichier d’en-tête avec le extern dans.

15
nos

Si vous partagez du code entre C et C++, n’oubliez pas d’ajouter ce qui suit au shared.hfichier:

#ifdef __cplusplus
extern "C" {
#endif

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

#ifdef __cplusplus
}
#endif
4
tritinia

Il existe une méthode plus propre avec un seul fichier d'en-tête, ce qui en simplifie la maintenance. Dans l'en-tête avec les variables globales, préfixez chaque déclaration avec un mot clé (j'utilise commun), puis incluez-la comme ceci dans un seul fichier source

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

et tout autre fichier source comme celui-ci

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

Assurez-vous simplement que vous n'initialisez aucune des variables du fichier globals.h, sinon l'éditeur de liens se plaindra car une variable initialisée n'est pas traitée en tant qu'externe, même avec le mot clé extern. Le fichier global.h ressemble à ceci

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

semble fonctionner pour tout type de déclaration. N'utilisez pas le mot clé commun sur #define bien sûr.

2
ivan