comment utiliser une variable définie dans un en-tête et les utiliser dans plusieurs fichiers source en utilisant extern. Je reçois une erreur de définition multiple.variable externe
Répondre
Une bonne règle à suivre est: "Ne pas définir choses dans les fichiers d'en-tête". Déclarez tout ce que vous voulez, mais les définitions doivent être limitées aux non-têtes. Une déclaration est simplement une notification que quelque chose existe. Une définition définit réellement ce que c'est.
La raison d'être de cette directive est d'empêcher exactement la situation que vous voyez: les objets sont définis deux fois (ou plus) car les fichiers d'en-tête sont inclus dans plusieurs unités de compilation.
Pour éviter cela, vous pouvez utiliser quelque chose comme:
myprog.h:
extern int myVar; // a declaration.
myprog.c:
#include "myprog.h"
int myVar = 7; // a definition.
otherbit.c:
#include "myprog.h"
int fn (void) {
myVar = 12;
return myVar;
}
La définition ci-dessus ne finissent dans myprog.o
, vous ne serez pas en obtenir une copie en otherbit.o
pour vous causer des problèmes au moment de la liaison. Laisser de côté cette bonne encapsulation rendrait ces variables globales une très mauvaise idée, c'est ainsi que je le ferais.
Le encapsulé façon de le faire serait quelque chose comme ceci:
myprog.h:
int getMyVar (void);
void setMyVar (int);
myprog.c:
#include "myprog.h"
static int myVar = 7;
int getMyVar (void) { return myVar; }
void setMyVar (int n) {
// Error checks on n here.
myVar = n;
}
otherbit.c:
#include "myprog.h"
int fn (void) {
setMyVar (12);
return getMyVar();
}
Encapsulation est essentiellement cacher des informations. Cela signifie que vous devez exposer comme peu de votre travail intérieur pour faire le travail, de peur que vous vous ouvriez la possibilité d'autres codes se faufiler sous les couvertures et invalider vos hypothèses (voir ci-dessous) ou le rendre plus difficile à changez vos fonctionnements intérieurs plus tard.
Un exemple classique est si vous voulez que la variable myVar
soit limitée à la plage comprise entre 0 et 359 inclusivement (disons un angle). Avec l'encapsulation, vous pouvez simplement utiliser:
void setMyVar (unsigned int n) { myVar = n % 360; }
et jamais à vous soucier de ce être invalide. Vous pouvez supposer sans risque, la corruption de mémoire de côté, que myVar
sera toujours dans la fourchette désirée. Vous ne voudriez pas avoir cette certitude si une certaine rogue de code utilisateur pourrait venir faire juste:
myVar = 32767;
sans que vous le sachiez. Vous devez soit répondre à des valeurs en dehors de votre gamme désirée ou le forcer à la plage valide au début de toutes vos fonctions:
myVar = myVar % 360;
C'est une mauvaise pratique de codage, et tout à fait inutile.
+1 pour les exemples propres et l'approche de programmation – INS
Oui, Merci paxdiablo pour votre réponse. Cela m'a beaucoup aidé. –
- 1. problème de portée variable accès à la variable externe
- 2. Javascript Variable non disponible en fichier externe
- 3. Variable externe non mise à jour
- 4. Accès variable externe en classe PHP
- 5. AS3, Pass variable externe à une fonction
- 6. Variable externe à une adresse spécifique
- 7. comment définir une variable pour le fichier javascript externe?
- 8. passe de paramètre $ .post() rappel à la variable externe
- 9. Problème de domaine externe Joomla
- 10. XML externe et AS3
- 11. Pourquoi la variable globale n'est pas initialisée avec la chaîne ce que j'ai donné dans la variable externe
- 12. XForms, jointure externe XSLTForms
- 13. flash appel ExternalInterface externe AS2
- 14. interface externe
- 15. Existe-t-il un moyen d'obtenir une variable externe (ou fonction) par nom?
- 16. Est-il possible d'accéder à une variable locale externe en PHP?
- 17. Est-il possible d'accéder à une variable membre d'une classe externe dans page.xaml.cs?
- 18. obtenir une valeur variable dans une page html et l'utiliser dans un js externe
- 19. Comment accéder à la variable de session codeigniter depuis un site externe
- 20. Comment récupérer du HTML à partir d'un site Web externe dans une variable dans ColdFusion?
- 21. Comment avoir accès à une variable externe dans une fermeture en rubis?
- 22. Transmettre la variable de tampon Vim en tant qu'argument pour la commande externe
- 23. Dans jQuery.post, comment puis-je obtenir la valeur de la fonction externe variable?
- 24. Mettre en cache le contenu HTML en stockant une variable javascript dans un fichier js externe?
- 25. flash as2: comment charger un texte externe dans une variable? (pas loadvars)
- 26. Piège variable extérieur
- 27. Niveau de balise externe CSS externe d'un contrôle Flex
- 28. Classe interne et externe classe en C#
- 29. Croix externe Join?
- 30. animer swf externe
Est-ce une question C# ou C? – Oded
C# ne sais pas "en-têtes" et vous ne pouvez pas définir de variables sans une classe dans C#. c'est une question c ou C++. – Jack
Je l'ai modifié de C# à C, mais il peut s'agir de C++ pour tout ce que nous savons. – reinierpost