Увеличение глобального статического int в main - PullRequest
0 голосов
/ 28 сентября 2011

Вот мой код:

Файл DataTypes.h

static int count=0;

Файл TreeOps.h

#include"DataTypes.h"
void printTree(Tree* ptr)

Файл TreeOps.c

#include"TreeOps.h"
void printTree(pointer){
count++;  // incrementing the count;
printf("%d",counter);
}

Файл TreeMain.c

#include"TreeOps.h"
printTree(pointer); // all the necessary declarations are done.
printf("%d",count);

Если в функции printTree, printf дает count = 1; в то время как в основной функции он дает мне 0.

Почему?

Ответы [ 3 ]

4 голосов
/ 28 сентября 2011

статическая переменная в этом контексте означает: каждый файл c имеет свой собственный экземпляр переменной. Удалить статическое определение в h-файле:

extern int count;

и добавьте это в один из файлов c:

int count = 0;

extern означает: это предварительная декларация. Определяя переменную как extern, вы сообщаете компилятору, что count имеет тип int, и эта переменная где-то создается. На самом деле эта переменная создается в одном и только одном файле c. Вы можете использовать его в любом файле c, где включен DataTypes.h. В файле, где эта переменная создана, компилятор использует ее. Во всех остальных файлах эта переменная становится внешней ссылкой, которая позже разрешается компоновщиком.

1 голос
/ 28 сентября 2011

Во-первых, определение данных или функций в заголовочных файлах - плохая практика в программировании на Си. В DataTypes.h вы не просто объявляете переменную count, но вы определяете это.

На самом деле происходит то, что count определяется отдельно в каждой единице перевода, и после связывания вы получаете две переменные. Компоновщик не объединяет их, потому что они помечены static, что означает, что они должны быть локальными для единицы перевода.

Если вы хотите, чтобы переменная count была разделена между единицами перевода TreeOps.c и TreeMain.c, вы должны использовать extern в заголовочном файле, который только объявляет это:

extern int count;

А затем глобально определите его как int count в TreeOps.c или TreeMain.c.

0 голосов
/ 28 сентября 2011

В вашей программе нет "глобального статического int".Объекты, объявленные как static, не могут быть «глобальными».Весь смысл объявления чего-либо static состоит в том, чтобы сделать его локальным для определенной единицы перевода.Это именно то, что вы сделали: вы объявили две полностью независимые статические переменные в двух разных единицах перевода.Каждая переменная является локальной для своей единицы перевода.Затем вы изменяете одну из этих переменных и печатаете другую.Неудивительно, что другой остается неизменным.

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

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