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 extern
s en haut de tous les autres fichiers C qui veulent l'utiliser? Cela ne semble pas idéal.
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
.
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;
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"
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.
Si vous partagez du code entre C et C++, n’oubliez pas d’ajouter ce qui suit au shared.h
fichier:
#ifdef __cplusplus
extern "C" {
#endif
extern int my_global;
/* other extern declarations ... */
#ifdef __cplusplus
}
#endif
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.