Comment définir et déclarer des variables globales pour l'utilisation par le code de la bibliothèque?
fichier principal (prog.c):
#include "log.c"
#include "library.c"
static char * Foo;
Si certaines variables (char * Toto) est définie dans le fichier principal (prog.c), et il est requis par le journal.c une fonction appelée dans la bibliothèque.c, comment bien déclarer Foo pour être visible à partir du journal.c de l'espace de noms?
- Notez qu'il est considéré comme une mauvaise pratique de programmation ont une bibliothèque qui dépend des variables externes. Vous devez passer toutes les variables nécessaires en tant que paramètres de sorte que la bibliothèque n'a pas de dépendances externes et, par conséquent, peuvent être compilés séparément pour une utilisation dans plusieurs programmes.
- Le titre de ce fil est inacceptable. Ces threads restent indéfiniment donc "aujourd'hui" n'est pas utile de l'information, et il ne permet pas de résumer la question en tout cas.
Vous devez vous connecter pour publier un commentaire.
Il est aconventional pour inclure la bibliothèque de code source dans votre programme principal:
(Le point-virgule est nécessaire.)
Toutefois, étant donné que c'est ce que vous faites, si "ouvrir une session.c" doit voir la déclaration, vous pouvez tout simplement faire:
Maintenant la statique de la déclaration est visible à "ouvrir une session.c" (et "de la bibliothèque.c").
Si vous allez pour une installation conventionnelle, alors vous avez le code "du journal.c" accéder à une variable globale déclarée dans l'en-tête approprié (plutôt que d'un fichier de variables statiques). Toutefois, ces dépendances (où un fichier de bibliothèque dépend d'une variable globale) sont une nuisance. Le programme principal (ou un morceau de code) doit fournir la définition de la variable. Il serait préférable d'avoir le code dans le "journal.c" définir la variable, et le (présumé) de l'en-tête "du journal.h" déclarer la variable, puis le programme principal serait de définir la variable en conséquence. Ou, mieux, le code dans le "journal.c" fournir une fonction d'un ou de plusieurs fonctions pour manipuler la variable, et l'en-tête de déclarer ces fonctions, et que le programme principal serait de les utiliser.
Ajouter sa déclaration pour certains .h de fichier qui est inclus dans les deux .c fichiers. Définir dans un des fichiers.
Bien sûr, il ne peut pas être déclaré
static
pour que cela fonctionne depuis lestatic
mot-clé est une promesse que le nom ne sera pas nécessaire en dehors de ce module particulier.Par exemple, dans
prog.h
:dans
prog.c
:dans
log.c
:Maintenant, pour les mauvaises nouvelles.
Faire ce genre de chose crée un couplage entre les
prog.c
etlog.c
modules. Que le couplage ajoute le coût de la maintenance de votre application dans son ensemble. Une des raisons est qu'il n'existe aucun moyen pour empêcher d'autres modules à l'aide de la variable globale aussi. Pire, ils pourraient être en utilisant complètement par hasard, parce que son nom n'est pas assez descriptif.Pire, globals rendre beaucoup plus difficile de passer de mono-thread, programmes de programmes multi-thread. Chaque variable globale qui peut être consulté à partir de plus d'un thread est une source potentielle de vraiment difficile à diagnostiquer des bugs. La cure est à la garde de l'information qui doit être globale, avec des objets de synchronisation, mais galvaudé qui peuvent en résulter dans une application où tous les threads sont bloqués à l'exception de celle qui est actuellement à l'aide de l'échelle mondiale, faisant de l'application multi-thread efficacement monothread.
Il ya certainement des moments où le inter-module de couplage implicite par des variables globales est acceptable. Un cas d'utilisation pour des fins générales de l'ensemble de l'application options. Par exemple, si votre application prend en charge un
--verbose
option qui rend chatter pendant qu'il fonctionne, il donne du sens à l'indicateur défini par l'option et testé tout au long du code serait une variable globale.Il y a certainement des questions à de SORTE que plonger profondément dans les pièges de la globals et fournira des conseils sur leur utilisation judicieuse.
Vous voulez extern. Lorsque vous extern un nom de variable, vous faites une "promesse" que la variable existe pas lorsque vous lien. Vous voulez donner un stockage dans une .c fichier mais extern dans un en-tête. De cette façon, c'est juste une fois instancié, dans le .c du fichier de l'objet. Vous ne voulez pas avoir deux différents .o en utilisant le même nom pour faire référence aux différents emplacements dans la mémoire. (Comme indiqué ci-dessus, c'est presque toujours une mauvaise forme d'exiger quelque chose comme ça pour une bibliothèque.)
Donc dans un en-tête commun, vous auriez
commun.h
Puis en prog.c
Foo bar;
Et quand vous avez inclus commun.h dans le journal.c vous pouvez accéder à la barre de prog.c
Noter que statique est très différent en C qu'en Java. En Java, il est mondial à une Classe et disponible pour n'importe qui, même sans une instance de la classe. En C statique signifie que la variable n'est pas visible à l'extérieur de l'unité de compilation.
La réponse est simple:
Qui rend
Foo
visible dans le journal.c et la bibliothèque.c tout simplement en raison de la "déclarer avant l'utilisation de la règle".Cependant, ce que vous avez vraiment besoin de savoir, c'est que c'est méchant code! Vous avez commis au moins deux péchés; L'utilisation des variables globales et l'incapacité à comprendre l'utilisation séparée compilation et la liaison.