LINUX.ORG.RU

Помогите с глобальными переменными


0

0

Надо создать программу из нескольких исходников. В заголовочном файле объявляю переменную short value; и функцию void func(void);, данный файл включаю и в main(), и в func(). Однако при компиляции компоновщик дает ошибку, что в функции func() переменная value, объявленная в main(), объявляется вторично. Пробовал через указатели, т.е. в заголовке объявлял указатель, а в исходниках его разыменовывал, функия отработала, но в конце выдалось сообщение, что присвоен нулевой указатель. Что еще можно попробовать ?

anonymous

Мужики, простите, я уже разобрался, но все же - можно корректно объявлять глобальные переменные в заголовочном файле, чтоб потом сто раз их во всех файлах не объявлять, или нельзя ?

anonymous
()

Делай так:

В файле file.c

int variable;

В файле file.h

extern int variable

И везде, где нужно, подключи file.h

А вообще, старайся не пользоваться глобальными переменными.

Havoc ★★★★
()
Ответ на: комментарий от Havoc

Но ведь через них так удобно передавать данные...

anonymous
()

Ага, зато потом очень неудобно отлавливать баги.
Когда забудешь что в модуле А, используется переменная
которая была объявлена в модуле B, и может менятся функциями
из модулей C,D,E и F.

anonymous
()
Ответ на: комментарий от Havoc

. . .
> И везде, где нужно, подключи file.h
> А вообще, старайся не пользоваться глобальными переменными.
IMO вышеописанная Havoc'ом процедура "автоматического" описания
глобальных переменных - стандартные грабли, на которые наступают начинающие
программисты (хотя он правильно ответил на вопрос). И "отлов" багов тут не
при чем - если аккуратно писАть, то багов и не будет.

Проблемы начнутся, когда тебе понадобится изменить структуру программы и ты
вдруг обнаружишь, что все твои модули оказались неявным образом зависящими друг
от друга через глобальные переменные. А рано или поздно тебе захочется
эту структуру менять - например, использовать отлаженный модуль в другом
проекте.

Единственный более-менее безопасный путь работы с глобальными переменными -
явно описывать их external в начале каждого модуля. Разумеется, только те,
которые в данном модуле действительно используются.

Die-Hard ★★★★★
()

#define тоже предложишь в каждом модуле описывать? :)

Havoc ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.