J'ai un problème avec un programme. Je parie que cela a à voir avec le fait que j'utilise statique. Voici mon e
#include "t.h" void f() { cnt++; }
mon main.c
#include <stdio.h> #include "t.h" void main() { cnt=0; printf("before f : cnt=%d\n",cnt); f(); printf("after f : cnt=%d\n",cnt); }
et enfin mon fc
static int cnt; void f();
Le printf imprime cnt = 0 les deux fois. Comment est-ce possible quand je fais cnt ++? Des idées?
Merci d'avance
3 Réponses :
En C
, static
signifie "Local au module"
Notez que les instructions #include
ne font que coller l'en-tête fichier dans le fichier inclus.
par conséquent, vous créez deux symboles distincts (qui ont le même nom logique) dans différents modules.
f.c
cnt
est un autre cnt
que main.c
Remarque:
static
en C
a une signification différente de celle de son équivalent en C ++
.
et parce que C ++
est C
Compatible, static
en dehors d'une classe a la même signification que dans C
Modifier:
Dans votre cas, vous ne voulez pas d'un statique
, vous voulez une variable, mais je suppose que vous avez eu un problème avec l'éditeur de liens vous indiquant des "symboles ambigus".
Je suggère pour déclarer un extern
dans le fichier d'en-tête, et déclarer la variable réelle dans un module.
t.h extern int cnt; // declaration of the variable cnt main.cpp #include #include "t.h" void main() { cnt=0; printf("before f : cnt=%d\n",cnt); f(); printf("after f : cnt=%d\n",cnt); } t.cpp #include "t.h" int cnt = 0; // actual definition of cnt void f() { cnt++; }
Ouais - vérifiez le démontage du programme pour voir ce qui se passe. En tant que commentaire rédactionnel, c'est la raison pour laquelle il est généralement mal vu de définir des variables dans les fichiers d'en-tête. Les déclarations prospectives sont bien, mais vous ne voulez pas confondre les choses!
Alors que dois-je faire pour y remédier?
Supprimez le statique
.
@DimK Si votre problème a été résolu, vous devez accepter cette réponse.
Ne définissez pas cnt
dans votre fichier d'en-tête. Au lieu de cela, définissez-le dans fc
:
extern int cnt;
Puis dans main.c
, ajoutez ce qui suit avant le début de votre main
fonction:
#include "t.h" int cnt = 0; void f(){ cnt++; }
Le mot-clé extern
spécifie que cnt
a un lien externe. Vous êtes objectivement incorrect, @CarlNorum
Pourriez-vous expliquer la référence indéfinie à l'erreur `cnt 'alors?
Oups, cnt
ne devrait pas être statique. Mon erreur.
Les données ne doivent pas être définies dans les fichiers d'en-tête.
Dans votre exemple, vous allez créer une copie séparée de cette variable statique dans chaque module de compilation qui inclut ce fichier .h
.