|
Область видимости enum, C |
|
|
|
Oct 12 2009, 11:59
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
На сколько я понял, если в заголовочном файле определено что-то вроде Код enum packetTypes{ IDPacket, BlockPacket }; то пока не определена переменная типа packetTypes - никакой памяти никуда выделяться не будет? Т.е. это почти то-же, что и typedef, только объявили множество. ? Также верно следующее: 1. Определить переменную(в .c/.h файле) так: enum packetTypes packetType; можно только при условии include того заголовочного файле, в котором определен packetTypes 2. В любом другом файле, в котором не было include заголовочного - я никаким образом не смогу добраться до packetTypes. 3. Под enum не выделяется память(в отличие от const). 4. Глобальная переменная, определенная как enum packetTypes packetType; может быть видна из другого файла посредством extern enum packetTypes packetType; при условии, что include сделан( и,таким образом packetTypes определен) 5. Можно ли определить static enum packetTypes packetType; и ограничить область видимости переменной одним файлом?(не вижу причин, почему это может не работать. Но всё-же спрошу) 6. тип enum предполагается int. Как в Си изменить его, скажем, на unsigned int или long? Правильно ли я мыслю? Какие из этих утверждений верны, какие нет? А ещё всегда хотелось иметь под рукой первоисточник. Стандарт Си(какой там щас актуален). Если можно тоже ссылочку. Спасибо. P.S. Навеяно прочтением книги Ален И. Голуб - Правила программирования на Си и Си++ и осознанием того, что моя программа на Си выглядит ужасно и половина возможностей языка осталась "за кадром"
--------------------
The truth is out there...
|
|
|
|
|
 |
Ответов
|
Oct 12 2009, 13:52
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(Dima_G @ Oct 12 2009, 19:20)  Никак. Размер элемента enum всегда равен int А разве это не implementation defined? Цитата(sigmaN @ Oct 12 2009, 19:41)  На сколько я знаю, Код const unsigned char MAX_ROWS = 2; делает следующее: Создаёт переменную с указанным типом и именем и инициализирует её указанным значением. Так-же, компилятор при этом внимательно следит, чтобы этой переменной ничего не присваивали и ругается, если обнаруживает такую ситуацию. Т.е. память выделяется. В С компилятор обязан выделять под константы, объявленные указанным способом, память, т.к. по умолчанию глобальные объекты имеют внешнее связывание - т.е. на них могут быть ссылки из других единиц компиляции. В С++ константы по умолчанию имеют внутреннее связывание - т.е. область видимости такого объекта - scope данной единицы компиляции (файла), и любой вменяемый компилятор не будет под такие объекты выделять память. Конечно, можно заставить компилятор выделить память путем взятия адреса константы либо объявив ее как extern - в последнем случае эта константа явно указана как имеющая внешнее связывание, что приводит ситуацию к той, что в С. И наоборот, в С можно привести поведение константы к С++ному - для этого надо объявить константу как static - это будет ++ная константа. Попробуйте объявить свою константу так.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Oct 13 2009, 05:27
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(dxp @ Oct 12 2009, 17:52)  А разве это не implementation defined? Да, согласен  Цитата 6.7.2.2 Enumeration specifiers
Each enumerated type shall be compatible with char, a signed integer type, or an unsigned integer type. The choice of type is implementation-defined,108) but shall be capable of representing the values of all the members of the enumeration. The enumerated type is incomplete until after the } that terminates the list of enumerator declarations. (ISO/IEC 9899:TC2 Committee Draft — May 6, 2005) Цитата(sigmaN @ Oct 13 2009, 06:49)  Почему Linux пишут на Си и не включат режим C++?
P.S. т.е. я Ваш ответ принял. Мне просто интересно. В ядре - политика Торвальдса (ИМХО - зря). Не любит он плюсы. Цитата Linux creator Linus Torvalds joined in to explain: "In fact, in Linux we did try C++ once already, back in 1992. It sucks. Trust me - writing kernel code in C++ is a BLOODY STUPID IDEA.
"The fact is, C++ compilers are not trustworthy. They were even worse in 1992, but some fundamental facts haven't changed: 1) the whole C++ exception handling thing is fundamentally broken. It's _especially_ broken for kernels. 2) any compiler or language that likes to hide things like memory allocations behind your back just isn't a good choice for a kernel. 3) you can write object-oriented code (useful for filesystems etc) in C, _without_ the crap that is C++." http://www.opennet.ru/openforum/vsluhforumID9/8226.htmlА в юзерспейсе - полно приложений на ++;
|
|
|
|
|
Oct 13 2009, 07:31
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(Dima_G @ Oct 13 2009, 12:27)  В ядре - политика Торвальдса (ИМХО - зря). Не любит он плюсы. http://www.opennet.ru/openforum/vsluhforumID9/8226.htmlДа, попадались эти "доводы". Мракобесие, имхо. При всем уважении, дяденька, по ходу, не понимает плюсов. А непонимание порождает боязнь, т.к. вещь кажется неуправляемой. 2 SigmaN: включите режим ++, ничего там страшного нет. Пишите как обычно. Используйте только те средства, которые освоили. И это вполне комфортный и безопасный путь. С++ не заставляет сразу использовать исключения, множественное наследование, темплейты и ООП.  Все это используется в соответствии с задачей. И не бойтесь пробовать. Компилятор С++ в CCS, насколько помню, вполне приличный.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Oct 13 2009, 11:30
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(zltigo @ Oct 13 2009, 13:39)  Если программа не далеко ушла от "Hello World", то разницы не почувствует. Дальше, дальше все не так благостно  . На многие плюсы плюсового компилятора найдутся и свои весьма заметные минусы  . Использовать плюсовый компилятор для компиляции "сишных" исходников не самая хорошая идея, хотя раньше сам много лет так делал. А Вы можете привести примеры минусов С++ комиплятора для Си исходников?
|
|
|
|
|
Oct 13 2009, 13:38
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Dima_G @ Oct 13 2009, 14:30)  А Вы можете привести примеры минусов С++ комиплятора для Си исходников? На вскидку - incomplete types, неименованные структуры и union-ы, упоминание имени volatile переменной не является причиной обратиться к ней, другой размер литерала, передача параметра по ссылке добавленная для пущей "красоты" мешается, много разных мелочей, типа различия в определениях NULL. Возьмите любую программу приличного размера и просто компильните - различия увидите сами. После появления компиляторов следующих C99 желание пользоваться С++ для компиляции сишных исходников у меня заметно уменьшилось и постепенно сошло на нет. Каждому свое.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 13 2009, 13:55
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(zltigo @ Oct 13 2009, 16:38)  На вскидку - incomplete types, неименованные структуры и union-ы, упоминание имени volatile переменной не является причиной обратиться к ней, другой размер литерала, передача параметра по ссылке добавленная для пущей "красоты" мешается, много разных мелочей, типа различия в определениях NULL. Возьмите любую программу приличного размера и просто компильните - различия увидите сами. После появления компиляторов следующих C99 желание пользоваться С++ для компиляции сишных исходников у меня заметно уменьшилось и постепенно сошло на нет. Каждому свое. Ну в принципе да: С и С++ - это разные языки (впрочем, я так понял, что dxp имел в виду не компиляцию имеющихся сишных исходников, а ведение проекта с нуля, используя некоторые удобства С++, но программируя в си стиле). А можно поподробнее про "упоминание имени volatile переменной не является причиной обратиться к ней" - довольно часто использую в своих проектах на С++ код вида Код volatile DWORD* dwReg_ = reinterpret_cast<DWORD*> (SOME_REGISTER) *dwReg_ = ... а как я понял из ваших слов, в этом случае возможно "необращение" к регистру SOME_REGISTER
|
|
|
|
Сообщений в этой теме
sigmaN Область видимости enum Oct 12 2009, 11:59 Dima_G ЦитатаНа сколько я понял, если в заголовочном файл... Oct 12 2009, 12:20 kurtis Цитата3. Под enum не выделяется память(в отличие о... Oct 12 2009, 12:40 sigmaN Ok. Сппсибо. Просто хотел уточнить для верности.
... Oct 12 2009, 12:41 kurtis ЦитатаСоздаёт переменную с указанным типом и имене... Oct 12 2009, 13:02 Сергей Борщ Цитата(sigmaN @ Oct 12 2009, 14:59) 6. ти... Oct 12 2009, 13:32 sigmaN ООоо, а про static к константе я как-то не подумал... Oct 12 2009, 14:21 demiurg_spb Цитата(sigmaN @ Oct 12 2009, 18:21) ООоо,... Oct 12 2009, 14:35 Палыч Цитата(sigmaN @ Oct 12 2009, 14:59) А ещё... Oct 12 2009, 14:32 sigmaN Однако давно хотел спросить как это так?
Код stati... Oct 12 2009, 20:50 dxp Цитата(sigmaN @ Oct 13 2009, 03:50) Комме... Oct 13 2009, 02:35 rezident Может объяснение корявое, но я понимаю так.
Вы сме... Oct 12 2009, 22:44 sigmaN Цитатаstatic const - есть правильная альтернатива ... Oct 13 2009, 00:36 rezident Цитата(sigmaN @ Oct 13 2009, 06:36) Это я... Oct 13 2009, 00:51 sigmaN Почему Linux пишут на Си и не включат режим C++?
... Oct 13 2009, 02:49 sigmaN Ok. В следующем проекте попробуем Oct 13 2009, 09:24 sigmaN Именно поэтому я и не кинулся тут-же "включат... Oct 13 2009, 15:36 dxp Цитата(zltigo @ Oct 13 2009, 20:38) На вс... Oct 14 2009, 02:55 zltigo Цитата(dxp @ Oct 14 2009, 05:55) Что каса... Oct 14 2009, 14:57  dxp Цитата(zltigo @ Oct 14 2009, 21:57) Тольк... Oct 15 2009, 03:41   zltigo Цитата(dxp @ Oct 15 2009, 06:41) Обоснуйт... Oct 15 2009, 13:56    Сергей Борщ Цитата(zltigo @ Oct 15 2009, 16:56) funct... Oct 15 2009, 23:51     zltigo Цитата(Сергей Борщ @ Oct 16 2009, 02:51) ... Oct 16 2009, 08:27      Сергей Борщ Цитата(zltigo @ Oct 16 2009, 11:27) типа ... Oct 16 2009, 09:20       zltigo Цитата(Сергей Борщ @ Oct 16 2009, 12:20) ... Oct 16 2009, 10:27        Сергей Борщ Цитата(zltigo @ Oct 16 2009, 13:27) делае... Oct 16 2009, 11:30      dxp Цитата(zltigo @ Oct 16 2009, 15:27) типа ... Oct 17 2009, 07:21       zltigo Цитата(dxp @ Oct 17 2009, 10:21) Если для... Oct 17 2009, 08:06  Dima_G Цитата(zltigo @ Oct 14 2009, 18:57) Я тут... Oct 15 2009, 04:11   dxp Цитата(Dima_G @ Oct 15 2009, 11:11) Тут в... Oct 15 2009, 05:35 sigmaN Потом как-нибудь попробую.
Проект не супер большо... Oct 14 2009, 19:15 kurtis ЦитатаСкажите, пожалуйста, как в данном конкретном... Oct 15 2009, 15:19 zltigo Цитата(kurtis @ Oct 15 2009, 18:19) ну а ... Oct 15 2009, 16:06  kurtis Цитата(zltigo @ Oct 15 2009, 19:06) Ну а ... Oct 15 2009, 16:39   zltigo Цитата(kurtis @ Oct 15 2009, 19:39) могу ... Oct 15 2009, 18:11
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|