Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите разместить глобальные переменные в одном файле!
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
fmdost
Подскажите Уважаемые, как обьявить глобальные переменные только в одном файле? Есть несколько с файлов *.с в которых приходится писать extern. Хотелось бы иметь только один такой файл.
prottoss
Не буду спрашивать, зачем это надо smile.gif

1. делаем Си файл, где объявляем ВСЕ глобальные переменные
Код
/* file GlobalVar.c */
#include "GlobalVar.h"
...
char g_A;
char g_B;
char g_C;
...


2. Делаем хедер
Код
/* file GlobalVar.h */
#ifndef GLOBAL_VAR_H
#define GLOBAL_VAR_H
...
extern char g_A;
extern char g_B;
extern char g_C;
...
#endif /* #ifndef GLOBAL_VAR_H */


3. Подключаем хедер ко всем Си-файлам, где должны присутсвовать глобальные переменные
fmdost
Так и деляю. Но переменных много, и постоянно добавляются. А по нормальному нельзя? Ну чтоб только 1 раз обьявить?
prottoss
Цитата(Т.Достоевский @ Aug 19 2007, 23:23) *
Так и деляю. Но переменных много, и постоянно добавляются. А по нормальному нельзя? Ну чтоб только 1 раз обьявить?
Я разве я предложил не нормальный способsmile.gif ? А чтоб один раз, такого, наверное нетуsad.gif
fmdost
Цитата(prottoss @ Aug 19 2007, 19:41) *
Я разве я предложил не нормальный способsmile.gif ? А чтоб один раз, такого, наверное нетуsad.gif

Ну не может такого быть, потому что неможет быть никогда!!!
arttab
а если объявить до main разве они не будут глобальные?
Непомнящий Евгений
Дык в чем проблема-то? Переменную надо определить - в одном месте и объявить - в каждом файле, где вы ее используете и не определяете (через хедер). Если переменных "очень много и постоянно добавляются" - может вам подумать о структурах\массивах?
Кстати, если использовать структуры, то можно извернуться так:
Код
/////// global.h
#ifndef _GLOBAL_H
#define _GLOBAL_H

typedef struct _myGlobals
{
  char g1;
  long g2;
  /// и т.д.
} MyGlobals;

extern MyGlobals G;

#endif

////// global.c

#include "global.h"

MyGlobals G;

////// main.c

#include "global.h"

int main()
{
  G.g1 = 'a';
  G.g2 = 1234;
}


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

Цитата(arttab @ Aug 20 2007, 08:11) *
а если объявить до main разве они не будут глобальные?


Будут. Но если они используются и в других файлах, то их все равно придется еще раз объявлять либо в хидере, либо в каждом таком c-файле.
Алекс-666
Цитата
Так и деляю. Но переменных много, и постоянно добавляются. А по нормальному нельзя? Ну чтоб только 1 раз обьявить?

Я "по-нормальному" делаю такой хидер:
Цитата
externn char g_A;
externn char g_B;
externn char g_C;

а перед его вызовом ставлю
#define externn //глобусы определяются, или
#define externn extern //глобусы декларируются
spf
Цитата(Т.Достоевский @ Aug 19 2007, 21:23) *
Так и деляю. Но переменных много, и постоянно добавляются. А по нормальному нельзя? Ну чтоб только 1 раз обьявить?

Делается один файл с объявлением переменных
Код
/* file Global.h */
#ifndef _GLOBAL_H
#define _GLOBAL_H

#ifdef _INIT_GLOBAL_
#define MODE
#else
#define MODE extern
#endif

MODE char g_A;
MODE char g_B;
MODE char g_C;

...


В одном из фалов (например main.c) перед его include объявляется _INIT_GLOBAL_ - переменные будут в нем выделены.
В остальных файлах делается простой include.
fmdost
Цитата(spf @ Aug 20 2007, 11:34) *
Делается один файл с объявлением переменных
Код
/* file Global.h */
#ifndef _GLOBAL_H //На эту строчку ругается #endif for this directive is missing???
...

Как написать правильно?
rezident
Цитата(Т.Достоевский @ Aug 22 2007, 02:31) *
Как написать правильно?

Эта ошибка означает что количество if и endif не совпадает. В вышеприведенном примере от spf не хватает одного endif.
fmdost
Цитата(rezident @ Aug 22 2007, 02:06) *
Эта ошибка означает что количество if и endif не совпадает. В вышеприведенном примере от spf не хватает одного endif.

Чёта Я протупил.

spf. Гениально! МЕГАЗАЧОТ! Спасибо! 08.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.