|
|
  |
Видимость переменных, Проблема с enum |
|
|
|
Apr 1 2009, 09:32
|
Участник

Группа: Участник
Сообщений: 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
Если кто знает решение проблемы - прошу поделиться... Спасибо.
|
|
|
|
|
Apr 1 2009, 10:48
|
Участник

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

|
Все дошло, СПАСИБО.
|
|
|
|
|
Apr 2 2009, 06:33
|

Профессионал
    
Группа: Участник
Сообщений: 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;
|
|
|
|
|
Apr 2 2009, 06:49
|

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

|
Цитата(777777 @ Apr 2 2009, 10:33)  Что за уродство? Какие тайпдефы? Кто вас научил этим глупостям? нИкакое не уродство и ничё не глупости. А если несколько переменных надо определить? для каждого енум забивать чтоли? Я всегда (почти всегда) так пишу енумы и всегда структуры.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Apr 2 2009, 06:55
|

Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
|
Apr 2 2009, 06:59
|
Гуру
     
Группа: Свой
Сообщений: 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 На других С компиляторах можете попробовать сами
|
|
|
|
|
Apr 2 2009, 09:46
|

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

|
Цитата(XVR @ Apr 2 2009, 10:59)  На других С компиляторах можете попробовать сами Видите ли, дорогой товарищ, я давно выработал у себя привычку перед тем, как постить какой-либо кусок кода, даже самый мелкий, проверить его на реальном компиляторе. Этот код я проверил на VC7.1 - он, конечно, не для микроконтроллеров, но по крайней мере отсутствие на нем ошибок означает, что синтаксически все написано правильно. Разумеется, на других компиляторах могут быть проблемы, но это проблемы компиляторов, а не С. У вас, судя по выдаваемым ошибкам, просто не подключен h-файл, в которм определен этот enum.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|