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

 
 
> Область видимости enum, C
sigmaN
сообщение Oct 12 2009, 11:59
Сообщение #1


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. Навеяно прочтением книги Ален И. Голуб - Правила программирования на Си и Си++ и осознанием того, что моя программа на Си выглядит ужасно и половина возможностей языка осталась "за кадром" smile.gif


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
dxp
сообщение Oct 14 2009, 02:55
Сообщение #2


Adept
******

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



Цитата(zltigo @ Oct 13 2009, 20:38) *
На вскидку - incomplete types, неименованные структуры и union-ы, упоминание имени volatile переменной не является причиной обратиться к ней, другой размер литерала, передача параметра по ссылке добавленная для пущей "красоты" мешается, много разных мелочей, типа различия в определениях NULL.
Возьмите любую программу приличного размера и просто компильните - различия увидите сами. После появления компиляторов следующих C99 желание пользоваться С++ для компиляции сишных исходников у меня заметно уменьшилось и постепенно сошло на нет. Каждому свое.

Еще забыли enum'ы, которые в С++ являются именно перечислимым типом, в то время как в С - это просто еще один способ создания целых литералов. И обсуждаемые констатны, подход к которым в С++ куда более разумен. Да, такого рода мелкие отличия есть, и отличия эти в большинстве в лучшую сторону. Мне вообще не понятны мотивы людей, которые с упорством, достойным лучшего применения, продолжают толкать С при наличии более эффективного и уже давно стабильного "надмножества" в виде С++.

Что касается ссылок, то это отнюдь не для красоты. Это очень полезная конструкция языка. Без нее, например, невозможно реализовать перегрузку операторов. Да и просто работать с объектами больших (и не очень) размеров куда эффективнее, чем по значению. И ссылки в ряде случаев оказываются хорошей (более безопасной и прозрачной) заменой указателям. Причин для их существования достаточно. И в голом С они бы тоже не помешали.

Цитата(Dima_G @ Oct 13 2009, 20:55) *
Ну в принципе да: С и С++ - это разные языки (впрочем, я так понял, что dxp имел в виду не компиляцию имеющихся сишных исходников, а ведение проекта с нуля, используя некоторые удобства С++, но программируя в си стиле).

Именно это я и имел в виду. Компилять большой проект, написанный на голом С, изобилующий незаконченными массивами, арифметикой с перечислимыми типами и прочим, занятие малополезное и малоприятное.



Цитата(sigmaN @ Oct 13 2009, 22:36) *
Именно поэтому я и не кинулся тут-же "включать C++" wink.gif

У вас большой проект, изобилующий чисто сишными феньками, которые упомянул zltigo? Вы пробовали его собирать в С++ режиме? Попробуйте ради интереса, расскажите, на чем споткнулся компилятор?


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 14 2009, 14:57
Сообщение #3


Гуру
******

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



Цитата(dxp @ Oct 14 2009, 05:55) *
Что касается ссылок, то это отнюдь не для красоты. Это очень полезная конструкция языка.

Только сделанная с C++ крайне дурно sad.gif
Цитата
И ссылки в ряде случаев оказываются хорошей (более безопасной и прозрачной) заменой указателям.

Я бы сказал, что именно в C++ реализации, с точностью до наоборот sad.gif.
Цитата
...изобилующий незаконченными массивами

Ну это ничуть не лучше, чем изощрятся в странных и непрозрачных действиях с обходом реальностей ввиде незаконченных массивов sad.gif и тех-же лишних ненужных имен для обязательно именованных структур. Просто 'C99' на сегодняшний день вполне продуманный, законченный и сбалансированый язык. Для эмбеддерских целей с переходом на C++ привязка к конкретному компилятору становится заметно жестче sad.gif, если конечно не писать "Hello World!" с "контроллерами светодиодов".
Цитата
Попробуйте ради интереса, расскажите, на чем споткнулся компилятор?

Естественно, что кондовый вариант скорее всего скушает. Хотя... Я тут прямо сейчас влет попробовал недавно писанный, под AVR практически буквально "контроллер светодиодов", который по идее должен был без проблем компилиться и плюсовым, но тем не менее споткнулся на
__flash char HexChars[16] = "0123456789ABCDEF";
smile.gif
Проблема выбора между фенечками 'C' и фенечками 'C++' sad.gif Я, как уже писал, последнее время склонился к фенечкам 'C99'. Естественно, для случаев, когда идет речь именно о фенечках, а не о полезности фундаментальных отличий C++.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
dxp
сообщение Oct 15 2009, 03:41
Сообщение #4


Adept
******

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



Цитата(zltigo @ Oct 14 2009, 21:57) *
Только сделанная с C++ крайне дурно sad.gif

Обоснуйте, пожалуйста. На примере.


Цитата(zltigo @ Oct 14 2009, 21:57) *
Я бы сказал, что именно в C++ реализации, с точностью до наоборот sad.gif.

Обоснуйте, пожалуйста. Тоже на примере.

Цитата(zltigo @ Oct 14 2009, 21:57) *
Ну это ничуть не лучше, чем изощрятся в странных и непрозрачных действиях с обходом реальностей ввиде незаконченных массивов sad.gif

Ничего не понял.

Цитата(zltigo @ Oct 14 2009, 21:57) *
и тех-же лишних ненужных имен для обязательно именованных структур.

Опять не понял о чем речь. sad.gif Каких ненужных имен? Что такое обязательно именованные структуры?

Цитата(zltigo @ Oct 14 2009, 21:57) *
Просто 'C99' на сегодняшний день вполне продуманный, законченный и сбалансированый язык.

Который реально ничем не лучше С++. И значительно слабее в принципе.

Цитата(zltigo @ Oct 14 2009, 21:57) *
Для эмбеддерских целей с переходом на C++ привязка к конкретному компилятору становится заметно жестче sad.gif, если конечно не писать "Hello World!" с "контроллерами светодиодов".

Так было несколько лет назад (5+). Но сегодня ситуация уже совсем иная. Платформ в embedded, для которых есть С и нет С++, по пальцам можно пересчитать.


Цитата(zltigo @ Oct 14 2009, 21:57) *
Естественно, что кондовый вариант скорее всего скушает. Хотя... Я тут прямо сейчас влет попробовал недавно писанный, под AVR практически буквально "контроллер светодиодов", который по идее должен был без проблем компилиться и плюсовым, но тем не менее споткнулся на
__flash char HexChars[16] = "0123456789ABCDEF";

И об какое ограничеие С++ тут споткнулся компилятор?

Цитата(zltigo @ Oct 14 2009, 21:57) *
Проблема выбора между фенечками 'C' и фенечками 'C++' sad.gif Я, как уже писал, последнее время склонился к фенечкам 'C99'. Естественно, для случаев, когда идет речь именно о фенечках, а не о полезности фундаментальных отличий C++.

С++, если его использовать именно как С++, а не только как "улучшенный С" (что приемлемо только на начальном этапе, а дальше надо расти), дает колоссальные преимущества перед С в первую очередь в том, что порождает иной способ мышления при программировании - поощряет подход, когда программист видит в программе не просто переменные и функции, а объекты, имеющие непосредственное отношение к объектам реального мира. Позволяет выстраивать в программе иерархию объектов и организовать между ними органичные связи так, что эта система объектов и связей является отражением своего "прототипа" из реального мира... В С тоже можно подходить так же, но сам язык никак не поддерживает это, поэтому тут придется напрягаться и появится немало "технологического" кода.

Про возможности ООП. В последнем проекте пришлось разрабатывать GUI. Вообще не понимаю, как работать с GUI без возможностей наследования и полиморфизма. Как представлю, что все это пришлось бы реализовывать на голом С, так просто паника подкатывает. smile.gif


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 15 2009, 13:56
Сообщение #5


Гуру
******

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



Цитата(dxp @ Oct 15 2009, 06:41) *
Обоснуйте, пожалуйста. На примере.

function( a );
Скажите, пожалуйста, как в данном конкретном случае (С++) передается параметр 'a' по ссылке, или по значению?
Цитата
Каких ненужных имен? Что такое обязательно именованные структуры?

Тут ошибся sad.gif - редко на плюсах пишу - привиделось. Зато вспомнилось такое
Цитата
struct aaa {
const int aa;
};

Ну очень заботливый IAR C++ компилятор ругался.

Цитата
Так было несколько лет назад (5+). Но сегодня ситуация уже совсем иная. Платформ в embedded, для которых есть С и нет С++, по пальцам можно пересчитать.

Речь идет не о том, декларировано наличие какого-либо ПОДМНОЖЕСТВА C++ для embedded компилятора, а в том, насколько эти усеченные реализации СОВПАДАЮТ у разных компиляторов. Я вот относительно недавно замаялся один чужой C++ проект для банального x86 править под Watcom компилятор - плюнул и Visual Studio взгромоздил.

Цитата
Про возможности ООП. В последнем проекте пришлось разрабатывать GUI. Вообще не понимаю, как работать с GUI без возможностей наследования и полиморфизма. Как представлю, что все это пришлось бы реализовывать на голом С, так просто паника подкатывает. smile.gif

smile.gif О это да. По иронии судьбы мои первые сишные опыты были на C++. Только появился свежайший Turbo C++ V1.0 компилятор, свободная IBM PC/XT и... На спор с уже достаточно опытным сишным программистом наперегонки, и с выжиманием СКОРОСТИ начали писать псевдографическую оконную библиотеку для порграмматора и с дальнейшим ее развитием под терминал тестовой системы. Короче, зеленый совсем, но победил за пару недель вечерних работ тогда я smile.gif. Уж больно все классически идеально все сие на плюсы ложилось. В буквальном смысле компилятор думал и делал за программиста очень многое. Потом... потом правда спустя несколько лет выжимание всего и вся для работы на 4.7MHz (не путать с гигагерцами smile.gif ) XT привело к переводу ее-;t на 'C', к заметному использованию ASM...
И стал меня и 'C' в большинстве случаев очень даже устраивать.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 15 2009, 23:51
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(zltigo @ Oct 15 2009, 16:56) *
function( a );
Скажите, пожалуйста, как в данном конкретном случае (С++) передается параметр 'a' по ссылке, или по значению?
На самом деле в этой точке совершенно не важно, передается он по ссылке или по значению. Это важно внутри реализации function(), а там это известно и реализация пописана с учетом способа передачи.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 16 2009, 08:27
Сообщение #7


Гуру
******

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



Цитата(Сергей Борщ @ Oct 16 2009, 02:51) *
На самом деле в этой точке совершенно не важно....

типа совершенно не важно, изменится-ли значение 'a' после вызова этой функции??? Боюсь,что лично для меня это слишком высокий уровень пофигизма абстракции smile.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 16 2009, 09:20
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(zltigo @ Oct 16 2009, 11:27) *
типа совершенно не важно, изменится-ли значение 'a' после вызова этой функции???
Передавая указатель вы получаете такую же неопределенность. Может изменить, а может и не изменить. Даже если указатель в параметре описан как указатель на константный объект - его можно внутри функции грубой силой привести к указателю на неконстантный.
Цитата(zltigo @ Oct 16 2009, 11:27) *
Боюсь,что лично для меня это слишком высокий уровень пофигизма абстракции smile.gif.
Ну, как горорил один мой бывший шеф, имеющий первое высшее образование - медицинское, "сдуру можно и х.. сломать".


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 16 2009, 10:27
Сообщение #9


Гуру
******

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



Цитата(Сергей Борщ @ Oct 16 2009, 12:20) *
Передавая указатель вы получаете такую же неопределенность. Может изменить, а может и не изменить.

Ну если пуститься в схоластические рассуждения, то дело В САМОМ ФАКТЕ ВОЗМОЖНОСТИ ИЗМЕНЕНИЯ в одном случае и гарантированной НЕ возможности в другом. Делать эти два случая неразличимыми - ДУРНО. О чем я собственно и написал в начале. К тому как что-либо, в том числе и передача по ссылке, реализовано Виртом надо относится с большим вниманием.
А так, да в принципе для обеспечения более строгой работы с объектом по ссылке, нежели через указатель вещь не бесполезная. Наверное кому-то поможет, хотя с точки зрения минимализма и универсализма достаточно указателей. Причем поскольку наличие ссылок не покрывает возможности указателей, то культуру работы с указателями по любому надо в себе воспитывать. Умение уверено обращаться с указателями, делает лично для меня наличие передачи параметра по ссылке не сильно привлекательной.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
- - dxp   Цитата(Dima_G @ Oct 12 2009, 19:20) Никак...   Oct 12 2009, 13:52
|- - Dima_G   Цитата(dxp @ Oct 12 2009, 17:52) А разве ...   Oct 13 2009, 05:27
|- - dxp   Цитата(Dima_G @ Oct 13 2009, 12:27) В ядр...   Oct 13 2009, 07:31
|- - zltigo   Цитата(dxp @ Oct 13 2009, 10:31) 2SigmaN:...   Oct 13 2009, 10:39
|- - Dima_G   Цитата(zltigo @ Oct 13 2009, 13:39) Если ...   Oct 13 2009, 11:30
|- - zltigo   Цитата(Dima_G @ Oct 13 2009, 14:30) А Вы ...   Oct 13 2009, 13:38
|- - Dima_G   Цитата(zltigo @ Oct 13 2009, 16:38) На вс...   Oct 13 2009, 13:55
|- - zltigo   Цитата(Dima_G @ Oct 13 2009, 16:55) а как...   Oct 13 2009, 14:03
- - 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
|||- - Сергей Борщ   Цитата(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


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

 


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


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