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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> C++: #define vs. const, Что целесообразнее применять?
rezident
сообщение Jun 22 2007, 14:26
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(dxp @ Jun 22 2007, 20:19) *
А в С от перечислимого типа только название.

А разве структуры и объединения в ANSI C не к тому же перечислимому типу относятся? Сорри, если не в кассу unsure.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 22 2007, 14:29
Сообщение #17


Гуру
******

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



Цитата(dxp @ Jun 22 2007, 17:19) *
Думается, что Вы не будете в восторге от использования для мытья волос воды, даже если на ней написно "Шампунь". biggrin.gif

Буду! Если альтернатива вообще не мыть голову.
Собственно у 'С' реализации один известный мне недостаток - те самые ++, += к перечислимому (псевдо перечислимому) типу. Собственно других я не знаю и уж тем более ни на один недостаток в повседневной жизни с принятым мной стилем написания не наступал. А от очень массовых ошибок даже 'C' enum помогает очень хорошо, пусть даже c warning вместо error. И не использовать его там, где можно использовать обходясь тупыми вообще ни к чему не обязывающими цифирями это совершенно не рационально!

Сообщение отредактировал zltigo - Jun 22 2007, 14:46


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
CaPpuCcino
сообщение Jun 22 2007, 18:26
Сообщение #18


тоже уже Гуру
******

Группа: Свой
Сообщений: 2 047
Регистрация: 13-06-05
Из: Кёлн - Санкт-Петербург
Пользователь №: 5 973



Цитата(dxp @ Jun 22 2007, 11:04) *
Код
// file.h
int a = 10;
...
void f(int x);

// file.cpp
...
f(a);

не приведет ни к какому размещению константы 'a' в памяти - будет точно такая же подстановка, как и в случае с макросом. Но уже с контролем типов.

да, по-моему контроль типов в случае констант и дефайнов ни при чём - в случае макроса препроцессор заменит имя макроса на литерал а уже компилятор будет видеть литерал и произведёт такую же проверку и приведение (если возможно) типов. важнее как раз (как было уже сказано) область видимости. не так ли?


--------------------
И снова на арене цирка - дрессированные клоуны!! Оказываем консультации по электронике за симпу круглосуточно.
Go to the top of the page
 
+Quote Post
dxp
сообщение Jun 23 2007, 03:38
Сообщение #19


Adept
******

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



Цитата(rezident @ Jun 22 2007, 21:26) *
А разве структуры и объединения в ANSI C не к тому же перечислимому типу относятся? Сорри, если не в кассу unsure.gif

Структуры являются агрегатным типом, а не перечислимым. Объединения - это вообще просто мапинг объектов разных типов на одну память. А перечислимый тип (enum) - это тип, который описывает ограниченное - перечисленное - множество значений и объекты этого типа могут принимать только эти значения. Если объекты перечислимого типа безпрепятственно могут принимать любые значения, то таковой тип перечислимым по сути не является. Что и имеет место в С.

Цитата(CaPpuCcino @ Jun 23 2007, 01:26) *
да, по-моему контроль типов в случае констант и дефайнов ни при чём - в случае макроса препроцессор заменит имя макроса на литерал а уже компилятор будет видеть литерал и произведёт такую же проверку и приведение (если возможно) типов. важнее как раз (как было уже сказано) область видимости. не так ли?

Контроль типов тоже причем. Например, есть две перегруженные функции:

void f(short);
void f(long);

#define SLON 10
const short Slon = 10;

...
f(SLON); // ошибка компиляции - неодноначность при выборе функции
f(Slon); // все нормально - вызывается void f(short)

Примеров, где информация о типе является значимой, достаточно. Уже не говоря о том, что константы могут быть не только объектами встроенных типов, но указателями, структурами и др, что на макросах реализуется, мягко говоря, криво.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 23 2007, 13:04
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(dxp @ Jun 23 2007, 09:38) *
Если объекты перечислимого типа безпрепятственно могут принимать любые значения, то таковой тип перечислимым по сути не является. Что и имеет место в С.

Ок. Понятно. Спасибо за объяснение.
Go to the top of the page
 
+Quote Post
CaPpuCcino
сообщение Jun 23 2007, 20:06
Сообщение #21


тоже уже Гуру
******

Группа: Свой
Сообщений: 2 047
Регистрация: 13-06-05
Из: Кёлн - Санкт-Петербург
Пользователь №: 5 973



Цитата(dxp @ Jun 23 2007, 07:38) *
Контроль типов тоже причем. Например, есть две перегруженные функции:

основательно. принимается. a14.gif


--------------------
И снова на арене цирка - дрессированные клоуны!! Оказываем консультации по электронике за симпу круглосуточно.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jun 23 2007, 21:32
Сообщение #22


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Вообще подобные вопросы неплохо разложены в книге Брюса Эккеля "Философия C++". Очень рекомендую почитать на досуге.
Go to the top of the page
 
+Quote Post

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

 


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


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