глобальные переменные в .h файлах

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
cahek80
Держит паяльник хвостом
Сообщения: 903
Зарегистрирован: Сб сен 11, 2010 17:32:42

глобальные переменные в .h файлах

Сообщение cahek80 »

доброго времени суток.
Подскажите пожалуйста, почему не получается. Пишу на микроС, в проекте в файле
Globals.h определяю некоторые глобальные переменные

Код: Выделить всё

#ifndef Globals__
  #define Globals__
  char timeDay, timeMth, timeYear, timeDow, timeHr, timeMin, timeSec;
#endif
далее хочу эти переменные в некоторых модулях использовать, соответственно в начале С файла объявляю #include "Globals.h"
и радостно получаю ошибку компилятора, что переменная "редефинед".
Интернета уже обкурился. Все как-бы правильно с первого взгляда. но почему не получается - не понимаю.
Не нужно дергать спящего тигра за усы! Не высыпается 3-ий день!
Реклама
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: глобальные переменные в .h файлах

Сообщение BerZerK-ku »

А в чем загвоздка-то? При такой записи получается, что в нескольких файлах объявлены глобальные переменные с одинаковыми именами. Используйте extern.
Реклама
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: глобальные переменные в .h файлах

Сообщение Мастер Ломастер »

определение переменных в хидерах - это дурной стиль программирования.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: глобальные переменные в .h файлах

Сообщение urry »

Код: Выделить всё

определение переменных в хидерах - это дурной стиль программирования.
спасибо, с утра повысилось настроение. :)
Имелось, видимо, в виду то, что хедер вместе с переменными подключается к другому файлу и область видимость переменных увеличивается , что уменьшает безопасность кода ? :)
Так у него глобальные, что ему и надо.
Реклама
Эиком - электронные компоненты и радиодетали
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: глобальные переменные в .h файлах

Сообщение Мастер Ломастер »

возможно, моя терминология не совсем общепринятая, но лично я выделяю три важных момента в существовании любой Сишной сущности:
1. описание
2. определение
3. использование
так вот, с моей скромной точки зрения, в хидерах могут присутствовать только описывающие конструкции Си, но не определяющие и использующие. то есть
int a, b, c; в хидере недопустимо, но extern int a, b, c; допустимо. потому что первое - это определяющая конструкция, т.е. выделяющая место в памяти, а второе - лишь информация для компилятора и компоновщика о факте наличия переменных.

в связи с этим не вижу ничего смешного в своем предыдущем посте.
битва с дураками проиграна, победители торжествуют. слава победителям!
Реклама
cahek80
Держит паяльник хвостом
Сообщения: 903
Зарегистрирован: Сб сен 11, 2010 17:32:42

Re: глобальные переменные в .h файлах

Сообщение cahek80 »

кстати, если пишу через extern - тоже получаю ошибку. (затрудняюсь сказать какую. ибо всё дома).
Поскольку с СИ я еще пока на "ВЫ" еще бывают подобные глупые вопросы. :(

ЗЫ
В той же делфи я объявлял структуру или глобальные переменные в интерфейсе в отдельном модуле, а потом только подключал по остальным модулям.

ЗЫ
получается, в хидере я их через extern прописываю, а потом в сишнике должен их еще определить?
Не нужно дергать спящего тигра за усы! Не высыпается 3-ий день!
Реклама
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: глобальные переменные в .h файлах

Сообщение urry »

компилятору нужна информация о виде переменных, которые находятся извне - он создает на каждый с файл объектный, в котором эти переменные маркируются как экспортируемые или импортируемые.
Задача линкера - увязать все объектные файлы в 1 - основываясь на этой информации, которые есть в объектных файлах . Если переменные будут везде помеченные как экстерн, они нигде не появятся физически.
В 1 файле они должны быть объявлены вживую, например

global.h

typedef struct{
char hour;
char minute;
char sek;
}time;
extern time g_Time;

file1.c
#include "global.h"
time g_Time; // в этом файле они живые
//
g_Time.sek=20;

file2.c
#include "global.h" // здесь ничего делать не нужно
g_Time.sek=10;
Последний раз редактировалось urry Вт ноя 01, 2011 16:23:11, всего редактировалось 1 раз.
cahek80
Держит паяльник хвостом
Сообщения: 903
Зарегистрирован: Сб сен 11, 2010 17:32:42

Re: глобальные переменные в .h файлах

Сообщение cahek80 »

то-есть исходя из Вашего исходника я могу в том же global.c объявить time g_Time и потом уже их использовать в других файлах?
Не нужно дергать спящего тигра за усы! Не высыпается 3-ий день!
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: глобальные переменные в .h файлах

Сообщение urry »

Да.
cahek80
Держит паяльник хвостом
Сообщения: 903
Зарегистрирован: Сб сен 11, 2010 17:32:42

Re: глобальные переменные в .h файлах

Сообщение cahek80 »

Спасибо! :beer: сегодня вечером попробую.
Не нужно дергать спящего тигра за усы! Не высыпается 3-ий день!
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»