Y compris C fichier d'en-tête avec beaucoup de variables globales
J'ai un fichier inclus avec+ de 100 variables globales. Il est utilisé dans une bibliothèque, mais certains programmes que je suis reliant la lib également besoin d'accéder à la globals.
La façon dont il a été construit:
//In one library .c file
#define Extern
//In the programs that use the globals
#define Extern extern
//In the .h file
Extern int a,b,c;
J'ai eu du mal à comprendre pourquoi l'original programmeur a fait que j'ai donc enlevé qui définissent Extern choses. Maintenant, je pense que je comprends la chose à propos de TU avec l'aide de stackoverflow:
Un,
Deux,
Trois.
Maintenant, je comprends que je dois définir les variables globales dans un .c fichier dans la bibliothèque et de l'utilisation extern dans l' .h fichier. Le problème est que je ne veux pas dupliquer le code.
Dois-je retourner à #define Extern vaudou?
- Désolé de venir ces derniers temps mais le a accepté de répondre est la mauvaise approche. Frederik Slijkerman réponse est la bonne. Seules les déclarations dans .h les fichiers et les définitions .c fichiers.
extern var
est une déclaration, sansextern
il s'agit d'une définition. Mettre la définition de la variable dans le module (c'est à dire .fichier c) est-il logique (du point de vue sémantique) de la partie de. À l'inverse, ne jamais utiliser unextern var
dans un .c fichier.
Vous devez vous connecter pour publier un commentaire.
L'astuce ici est que l' .h fichier est utilisé de deux façons différentes - il est utilisé comme normal .h fichier dans lequel toutes les variables globales sont déclarées
extern
et il est également utilisé pour définir la globals eux-mêmes (sansextern
). C'est un vilain hack mais vous pouvez comprendre pourquoi quelqu'un a estimé nécessaire si vous avez un grand nombre de variables globales (un signe sûr de très mauvaise conception de logiciel !).De toute façon, il y a un peu plus de solution élégante - vous pouvez mettre tous vos globales dans un seul struct global, par exemple
-
-
Puis, quand vous avez besoin de se référer à un mondial, c'est par exemple
globals.a
au lieu de simplementa
, ce qui peut sembler être un inconvénient, mais c'est sans doute plus claire et plus facile à gérer que d'avoir nu globals dispersés dans tout le code.C'est un mauvais modèle pour définir Extern dans tous les .c fichier. Retrait il est probablement le meilleur, mais vous avez besoin de remplacer cette fonctionnalité en quelque sorte. Une approche est que vous pouvez utiliser un #define dans le .c fichier qui doit définir ces variables globales. Ce sera le signal de définir à l' .h pour ne extern les variables globales.
Par exemple:
Une bibliothèque .fichier c:
L'autre .c fichiers:
foo_library.h:
ou
Cela réduit la nécessité de définir la même chose dans chaque fichier source (sauf un) et contribuerait à réduire les erreurs. Je n'ai pas l'appeler Extern que peuvent causer de la confusion, comme il peut ou ne peut pas être "extern"
extern var
déclaration dans l'en-tête etvar
définition dans le droit.c
fichier. Tout autre type d'utilisation est incorrecte.Peut-être que je suis absent quelque chose de trop, mais je TOUJOURS utilisation de l'inclusion des gardes sur tous les fichiers d'en-tête j'ai créer:
foo.h:
foo.c:
bar.c:
La macro choses est stupide pour cela. Vient de mettre
dans votre fichier d'en-tête, et, dans UN .c fichier (généralement un avec le même nom que le .h fichier), mettre
Pas besoin de se stresser à propos de ce niveau de "duplication".
J'ai peut-être raté quelque chose, mais je ne vois pas de différence entre les
#define
truc et simplement à l'aide de laextern
mot-clé.Fondamentalement, vous devez déclarer le var dans une .h fichier et de le définir dans une .c fichier. Ne la considèrent pas la duplication de code - je pense que changer le point de vue est la meilleure chose que vous pouvez faire ici :). Vous pouvez écrire plusieurs lignes de code, mais ils vont être lisible :D.
Dans de grands programmes, il est très important d'avoir une seule ligne de déclarer et définir une variable globale. Par conséquent, la macro approche décrite ci-dessus est la bonne façon d'aborder la question.
Comme une règle du pouce - ne pas utiliser de variables globales. Parfois, vous avez besoin d'utiliser des variables dans le fichier mais il est préférable d'essayer de les éviter à tout:
Parfois en C, vous ne pouvez les éviter (en particulier dans le code hérité de quelqu'un) mais il est préférable de les garder hors.
Comme pour la déclaration, il peut être utile dans ce cas:
Alors que cela peut être gênant au début, il ne vous aider à éviter d'avoir à taper chose deux fois ou oublier d'inclure quelque chose dans un .c fichier.
J'ai vu:
avec toto.h étant:
#define DECLARE
est erronée.