2
votes

Y a-t-il un problème avec cette variable statique?

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


0 commentaires

3 Réponses :


5
votes

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++;
    }


4 commentaires

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.



0
votes

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++;
}


3 commentaires

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.



0
votes

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 .


0 commentaires