реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Помогите разместить глобальные переменные в одном файле!, Прочитал ниже про обьявления структур, ничего не понял.
fmdost
сообщение Aug 19 2007, 14:57
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Подскажите Уважаемые, как обьявить глобальные переменные только в одном файле? Есть несколько с файлов *.с в которых приходится писать extern. Хотелось бы иметь только один такой файл.

Сообщение отредактировал Т.Достоевский - Aug 19 2007, 15:00
Go to the top of the page
 
+Quote Post
prottoss
сообщение Aug 19 2007, 15:10
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Не буду спрашивать, зачем это надо 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. Подключаем хедер ко всем Си-файлам, где должны присутсвовать глобальные переменные


--------------------
Go to the top of the page
 
+Quote Post
fmdost
сообщение Aug 19 2007, 15:23
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Так и деляю. Но переменных много, и постоянно добавляются. А по нормальному нельзя? Ну чтоб только 1 раз обьявить?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Aug 19 2007, 15:41
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



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


--------------------
Go to the top of the page
 
+Quote Post
fmdost
сообщение Aug 19 2007, 15:52
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Цитата(prottoss @ Aug 19 2007, 19:41) *
Я разве я предложил не нормальный способsmile.gif ? А чтоб один раз, такого, наверное нетуsad.gif

Ну не может такого быть, потому что неможет быть никогда!!!
Go to the top of the page
 
+Quote Post
arttab
сообщение Aug 20 2007, 04:11
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



а если объявить до main разве они не будут глобальные?


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Aug 20 2007, 04:18
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Дык в чем проблема-то? Переменную надо определить - в одном месте и объявить - в каждом файле, где вы ее используете и не определяете (через хедер). Если переменных "очень много и постоянно добавляются" - может вам подумать о структурах\массивах?
Кстати, если использовать структуры, то можно извернуться так:
Код
/////// 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-файле.

Сообщение отредактировал Непомнящий Евгений - Aug 20 2007, 04:19
Go to the top of the page
 
+Quote Post
Алекс-666
сообщение Aug 20 2007, 06:25
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 6-06-07
Пользователь №: 28 233



Цитата
Так и деляю. Но переменных много, и постоянно добавляются. А по нормальному нельзя? Ну чтоб только 1 раз обьявить?

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

а перед его вызовом ставлю
#define externn //глобусы определяются, или
#define externn extern //глобусы декларируются
Go to the top of the page
 
+Quote Post
spf
сообщение Aug 20 2007, 07:34
Сообщение #9


Странник
****

Группа: Свой
Сообщений: 766
Регистрация: 29-08-05
Из: Екатеринбург
Пользователь №: 8 051



Цитата(Т.Достоевский @ 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.


--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
Go to the top of the page
 
+Quote Post
fmdost
сообщение Aug 21 2007, 20:31
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



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

Как написать правильно?
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 21 2007, 22:06
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



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

Эта ошибка означает что количество if и endif не совпадает. В вышеприведенном примере от spf не хватает одного endif.
Go to the top of the page
 
+Quote Post
fmdost
сообщение Aug 21 2007, 22:47
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



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

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

spf. Гениально! МЕГАЗАЧОТ! Спасибо! 08.gif

Сообщение отредактировал Т.Достоевский - Aug 21 2007, 22:54
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 21:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01564 секунд с 7
ELECTRONIX ©2004-2016