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

 
 
> Область видимости 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 12 2009, 13:52
Сообщение #2


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 - это будет ++ная константа. Попробуйте объявить свою константу так. smile.gif


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


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Цитата(dxp @ Oct 12 2009, 17:52) *
А разве это не implementation defined?


Да, согласен smile.gif


Цитата
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

А в юзерспейсе - полно приложений на ++;
Go to the top of the page
 
+Quote Post
dxp
сообщение Oct 13 2009, 07:31
Сообщение #4


Adept
******

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



Цитата(Dima_G @ Oct 13 2009, 12:27) *
В ядре - политика Торвальдса (ИМХО - зря). Не любит он плюсы.

http://www.opennet.ru/openforum/vsluhforumID9/8226.html

Да, попадались эти "доводы". Мракобесие, имхо. При всем уважении, дяденька, по ходу, не понимает плюсов. А непонимание порождает боязнь, т.к. вещь кажется неуправляемой.

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


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


Гуру
******

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



Цитата(dxp @ Oct 13 2009, 10:31) *
2SigmaN: включите режим ++, ничего там страшного нет. Пишите как обычно.

Если программа не далеко ушла от "Hello World", то разницы не почувствует. Дальше, дальше все не так благостно sad.gif. На многие плюсы плюсового компилятора найдутся и свои весьма заметные минусы sad.gif. Использовать плюсовый компилятор для компиляции "сишных" исходников не самая хорошая идея, хотя раньше сам много лет так делал.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Oct 13 2009, 11:30
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



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


А Вы можете привести примеры минусов С++ комиплятора для Си исходников?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 13 2009, 13:38
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Oct 13 2009, 13:55
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 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 unsure.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 13 2009, 14:03
Сообщение #9


Гуру
******

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



Цитата(Dima_G @ Oct 13 2009, 16:55) *
а как я понял из ваших слов, в этом случае возможно "необращение" к регистру SOME_REGISTER unsure.gif

Нет не в этом, а в этом:
Код
*dwReg_;


--------------------
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
- - 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


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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 18:59
Рейтинг@Mail.ru


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