Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Видимость переменных
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Пал
Понимаю, что тема уже неоднократно обсуждалась, но найти ничего не могу, потому спрошу здесь. Проект(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

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

typedef enum {rsOFF,rsON} MyEnum_t;

extern MyEnum_t rele_stat;
Пал
Все дошло, СПАСИБО.
777777
Цитата(_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;
MrYuran
Цитата(777777 @ Apr 2 2009, 10:33) *
Что за уродство? Какие тайпдефы? Кто вас научил этим глупостям?

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

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

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

Энумы - они сами могут быть именованными, поэтому нет никакой нужды в тайпдефах.
XVR
Цитата(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

На других С компиляторах можете попробовать сами
Палыч
Цитата(XVR @ Apr 2 2009, 09:59) *
И получаете по полной программе... На других С компиляторах можете попробовать сами
Уж, не знаю, что Вы там неправильно написали, или транслятор у Вас - кривой... Товарищ 777777 - прав. И приведённый код нормально компилится на других трансляторах (в том же Keil).
777777
Цитата(XVR @ Apr 2 2009, 10:59) *
На других С компиляторах можете попробовать сами

Видите ли, дорогой товарищ, я давно выработал у себя привычку перед тем, как постить какой-либо кусок кода, даже самый мелкий, проверить его на реальном компиляторе. Этот код я проверил на VC7.1 - он, конечно, не для микроконтроллеров, но по крайней мере отсутствие на нем ошибок означает, что синтаксически все написано правильно. Разумеется, на других компиляторах могут быть проблемы, но это проблемы компиляторов, а не С. У вас, судя по выдаваемым ошибкам, просто не подключен h-файл, в которм определен этот enum.
andrew_b
Цитата(777777 @ Apr 2 2009, 12:46) *
Этот код я проверил на VC7.1 - он, конечно, не для микроконтроллеров, но по крайней мере отсутствие на нем ошибок означает, что синтаксически все написано правильно.
Для C++, а не C, о чём вам тонко намекают.
Палыч
Цитата(andrew_b @ Apr 2 2009, 14:04) *
Для C++, а не C, о чём вам тонко намекают.
А, ведь верно! В соответствии со стандартом следовало бы записать так:
enum RELE_STAT {rsOFF,rsON};
enum RELE_STAT rele_stat = rsOFF;
ReAl
Цитата(Палыч @ Apr 2 2009, 14:49) *
А, ведь верно! В соответствии со стандартом следовало бы записать так:
enum RELE_STAT {rsOFF,rsON};
enum RELE_STAT rele_stat = rsOFF;

Или typedef-нуть, чтобы не тянуть каждый раз слово enum, о чём тут тоже уже сказали.
В С++ это не нужно, равно как и со словом struct.
BSVi
Еще позволю себе добавить, что не 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;
mdmitry
Цитата(BSVi @ Apr 2 2009, 23:58) *
лично я перечисления и структуры начинаю с подчерка,

Компилятор С может резервировать идентификаторы с подчеркиванием для своих нужд, хотя чаще используется два подчеркивания.
Это замечание примите к сведению.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.