Что-то не так с статической переменной? - PullRequest
2 голосов
/ 27 апреля 2019

У меня проблема с программой. Могу поспорить, что это связано с тем, что я использую статические. Вот мой т.ч

static int  cnt;

void f();

my 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);
 }

и наконец мой ф.с

#include "t.h"


void f()
{
        cnt++;
}

printf печатает cnt = 0 оба раза. Как это возможно, когда я делаю cnt ++? Есть идеи?

Заранее спасибо

Ответы [ 3 ]

5 голосов
/ 27 апреля 2019

В C, static означает «Локально для модуля»

Обратите внимание, что операторы #include просто вставляют заголовочный файл во включающий файл.
, следовательно, высоздание двух разных символов (бывает с одинаковым логическим именем) в разных модулях.
f.c cnt это разные cnt, тогда main.c

Примечание: static в C имеет другое значение, чем его C++ аналог.
и поскольку C++ является C Совместимым, static вне класса имеют то же значение, что и в C

Редактировать:
В вашем случае вы не хотите static, вам нужна переменная, но я думаю, у вас были проблемы с компоновщиком, рассказывающим вам о «неоднозначных символах».

Я бы предложил объявить extern в заголовочном файле и объявите фактическую переменную в модуле.

t.h 
  extern int cnt; // declaration of the variable cnt

main.cpp
  #include 
  #include "t.h"
  int cnt = 0; // actual definition of cnt
  void main()
  {
     cnt=0;
     printf("before f : cnt=%d\n",cnt);
     f();
     printf("after f : cnt=%d\n",cnt);
  }

t.cpp
    #include "t.h"

    void f()
    {
        cnt++;
    }
0 голосов
/ 27 апреля 2019

Данные не должны быть определены в заголовочных файлах.

В вашем примере вы создадите отдельную копию этой статической переменной в каждом модуле компиляции, который включает этот файл .h.

0 голосов
/ 27 апреля 2019

Не определяйте cnt в вашем заголовочном файле.Вместо этого определите его в f.c:

#include "t.h"

int cnt = 0;
void f(){
    cnt++;
}

Затем в main.c добавьте следующее перед началом вашей main функции:

extern int cnt;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...