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

 
 
 
Reply to this topicStart new topic
> Видимость переменных, Проблема с enum
Пал
сообщение Apr 1 2009, 09:32
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 3-12-08
Пользователь №: 42 171



Понимаю, что тема уже неоднократно обсуждалась, но найти ничего не могу, потому спрошу здесь. Проект(ARM+Keil) содержит много сишных файлов. У каждого свой хидер. Переменные объявляю в сишниках. В хидерах объявляю прототипы функций и переменные с приставкой extern. Для обеспечения видимости переменных и фунций в других сишниках проекта просто делаю #include xxx.h. Все работает. Все кроме переменных enum. Если обьявить такую переменную в сишнике
enum {rsOFF,rsON}rele_stat=rsOFF;
а потом в хидере
extern enum {rsOFF,rsON}rele_stat;

то компилятор ругается что мол в одном месте одно и то же объявляешь.

Если убрать из хидера символные значения и оставить просто
extern enum rele_stat;
то в других сишниках, если приинклудить туда этот хидер, компилятор не знает что такое rsOFF,rsON

Если кто знает решение проблемы - прошу поделиться... Спасибо.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Apr 1 2009, 09:56
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Пал @ Apr 1 2009, 12:32) *
Если кто знает решение проблемы - прошу поделиться...

typedef enum {rsOFF,rsON} MyEnum_t;

extern MyEnum_t rele_stat;
Go to the top of the page
 
+Quote Post
Пал
сообщение Apr 1 2009, 10:48
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 3-12-08
Пользователь №: 42 171



Все дошло, СПАСИБО.
Go to the top of the page
 
+Quote Post
777777
сообщение Apr 2 2009, 06:33
Сообщение #4


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

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(_Pasha @ Apr 1 2009, 13:56) *
typedef enum {rsOFF,rsON} MyEnum_t;

extern MyEnum_t rele_stat;

Что за уродство? Какие тайпдефы? Кто вас научил этим глупостям?

Делается все просто: в хедере (а не хидере!) пишешь:
enum RELE_STAT {rsOFF,rsON};

В с-файле:
RELE_STAT rele_stat = rsOFF;

если эта переменная нужна в нескольких с-файлах, то в общем хедере объявляешь ее extern
extern RELE_STAT rele_stat;
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Apr 2 2009, 06:49
Сообщение #5


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(777777 @ Apr 2 2009, 10:33) *
Что за уродство? Какие тайпдефы? Кто вас научил этим глупостям?

нИкакое не уродство и ничё не глупости.
А если несколько переменных надо определить? для каждого енум забивать чтоли?
Я всегда (почти всегда) так пишу енумы и всегда структуры.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
777777
сообщение Apr 2 2009, 06:55
Сообщение #6


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

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(MrYuran @ Apr 2 2009, 10:49) *
нИкакое не уродство и ничё не глупости.
А если несколько переменных надо определить? для каждого енум забивать чтоли?
Я всегда (почти всегда) так пишу енумы и всегда структуры.

Именно для нескольких так и делают. Реле много, но набор допустимых состояний у всех одинаковый - включено или выключено. Поэтому пишешь:

RELE_STAT rele1;
RELE_STAT rele2;
RELE_STAT rele3;
RELE_STAT rele4;
RELE_STAT rele5 = rsON;

Энумы - они сами могут быть именованными, поэтому нет никакой нужды в тайпдефах.

Сообщение отредактировал 777777 - Apr 2 2009, 06:56
Go to the top of the page
 
+Quote Post
XVR
сообщение Apr 2 2009, 06:59
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(777777 @ Apr 2 2009, 10:33) *
Что за уродство? Какие тайпдефы? Кто вас научил этим глупостям?

Делается все просто: в хедере (а не хидере!) пишешь:
enum RELE_STAT {rsOFF,rsON};

В с-файле:
RELE_STAT rele_stat = rsOFF;
И получаете по полной программе:
Код
enum RELE_STAT {rsOFF,rsON};
RELE_STAT rele_stat = rsOFF;

Цитата
C:\!>cl -c t.c
Microsoft ® 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright © Microsoft Corp 1984-1998. All rights reserved.

t.c
t.c(2) : error C2061: syntax error : identifier 'rele_stat'
t.c(2) : error C2059: syntax error : ';'
t.c(2) : error C2513: '/*global*/ ' : no variable declared before '='

Цитата
[rakhvato@msteplxl7 pts]$ gcc -c ~/t.c
/nfs/ims/home/rakhvato/t.c:2: error: syntax error before "rele_stat"
/nfs/ims/home/rakhvato/t.c:2: warning: data definition has no type or storage class

На других С компиляторах можете попробовать сами
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 2 2009, 09:01
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(XVR @ Apr 2 2009, 09:59) *
И получаете по полной программе... На других С компиляторах можете попробовать сами
Уж, не знаю, что Вы там неправильно написали, или транслятор у Вас - кривой... Товарищ 777777 - прав. И приведённый код нормально компилится на других трансляторах (в том же Keil).
Go to the top of the page
 
+Quote Post
777777
сообщение Apr 2 2009, 09:46
Сообщение #9


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

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(XVR @ Apr 2 2009, 10:59) *
На других С компиляторах можете попробовать сами

Видите ли, дорогой товарищ, я давно выработал у себя привычку перед тем, как постить какой-либо кусок кода, даже самый мелкий, проверить его на реальном компиляторе. Этот код я проверил на VC7.1 - он, конечно, не для микроконтроллеров, но по крайней мере отсутствие на нем ошибок означает, что синтаксически все написано правильно. Разумеется, на других компиляторах могут быть проблемы, но это проблемы компиляторов, а не С. У вас, судя по выдаваемым ошибкам, просто не подключен h-файл, в которм определен этот enum.
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Apr 2 2009, 11:04
Сообщение #10


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

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(777777 @ Apr 2 2009, 12:46) *
Этот код я проверил на VC7.1 - он, конечно, не для микроконтроллеров, но по крайней мере отсутствие на нем ошибок означает, что синтаксически все написано правильно.
Для C++, а не C, о чём вам тонко намекают.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 2 2009, 11:49
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(andrew_b @ Apr 2 2009, 14:04) *
Для C++, а не C, о чём вам тонко намекают.
А, ведь верно! В соответствии со стандартом следовало бы записать так:
enum RELE_STAT {rsOFF,rsON};
enum RELE_STAT rele_stat = rsOFF;
Go to the top of the page
 
+Quote Post
ReAl
сообщение Apr 2 2009, 12:36
Сообщение #12


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Палыч @ Apr 2 2009, 14:49) *
А, ведь верно! В соответствии со стандартом следовало бы записать так:
enum RELE_STAT {rsOFF,rsON};
enum RELE_STAT rele_stat = rsOFF;

Или typedef-нуть, чтобы не тянуть каждый раз слово enum, о чём тут тоже уже сказали.
В С++ это не нужно, равно как и со словом struct.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
BSVi
сообщение Apr 2 2009, 19:58
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 76
Регистрация: 18-12-07
Из: Киев
Пользователь №: 33 391



Еще позволю себе добавить, что не RELE, a relay - во-первых мешать транслитерацию (RELE) и английские (OFF) слова - это плохо, во-вторых заглавными буквами обычно обзывают задефайненые константы (ну ладно, это спороный пункт), лично я перечисления и структуры начинаю с подчерка, в-третьих не хорошо сокращать одну букву. В итоге я бы написал так

С - вариант
в хереде
typedef enum { relay_off, relay_on } _relay_state;
в си-файле
_relay_state relay1_state = relay_off;
опять в хидере
extern _relay_state relay1_state;

С++ - вариант
в хереде
enum _relay_state { relay_off, relay_on } ;
в с++ -файле
_relay_state relay1_state = relay_off;
опять в хидере
extern _relay_state relay1_state;


--------------------
http://bsvi.ru/ - блог эмбеддера
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Apr 3 2009, 09:33
Сообщение #14


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(BSVi @ Apr 2 2009, 23:58) *
лично я перечисления и структуры начинаю с подчерка,

Компилятор С может резервировать идентификаторы с подчеркиванием для своих нужд, хотя чаще используется два подчеркивания.
Это замечание примите к сведению.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 17:46
Рейтинг@Mail.ru


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