Последние темы Поиск
Общие форумы
Специализированные форумы
ПроцессорыРазгон и охлаждениеСистемные платыМодули памятиВидеосистемаTV- и FM-тюнеры, видеовход, видеовыходЦифровое видео: захват, монтаж, обработкаМониторы и другие устройства отображенияЦифровое фотоБеспилотные летательные аппаратыЦифровой звукProAudio: Профессиональное звуковое оборудованиеСтереосистемыДомашний кинотеатр: проигрыватели и источники сигналаДомашний кинотеатр: аудиосистемаДомашний кинотеатр: ТV и проекторыМагнитные и SSD накопителиОптические носители информацииСетевые носители информацииПериферияКорпуса, блоки питания, UPSСети, сетевые технологии, подключение к интернетуСистемное администрирование, безопасностьСерверыНоутбуки, нетбуки и ультрабукиПланшеты и электронные книгиМобильные телефоны, смартфоны, кпк, коммуникаторыМобильные гаджетыОператоры и технологии мобильной связиТелефония, телекоммуникации, офисные АТСБытовая техника
Программы
Игры
Авторские форумы
Прочие форумы
Форумы поддержки портала iXBT.com
Архивы конференции
Архив "О Конференции"Архив "Процессоры"Архив "Разгон и охлаждение"Архив "Системные платы"Архив "Модули памяти"Архив "Видеосистема"Архив "Видеозахват"Архив "Мониторы и другие устройства отображения"Архив "Цифровое изображение"Архив "Цифровой звук"Архив "Периферия"Архив "Корпуса, блоки питания, UPS"Архив "Коммуникации: сети и сетевые технологии"Домашний интернет, модемы (архив)Архив "Системное администрирование, безопасность"Архив "Мобильная связь"Программы Microsoft: Windows, Office, Server, Windows LiveАрхив "OС и системное ПО"Архив "Программы: Интернет"Архив "Программирование"Форум прикладных программистовАрхив "Электронные устройства и компоненты"Архив "Околокомпьютерный Флейм & Общий"Архив "Полемика (Злобный Флейм)"Околоавтомобильный ФлеймФорум ремонтниковВопросы компании IntelФотокамеры SamsungФорум о магазине приложений RuStoreФорум по продукции компании Huawei
Справка и сервисы
Другие проекты iXBT.com
Эта тема расположена в архиве и закрыта для обсуждения.
Страницы:Кликните, чтобы указать произвольную страницу12далее
Nashev: Archive: const vs #define
Nashev
unregistered
Автор темы
N
Nashev unregisteredАвтор темы
  24 года назад / 22 марта 2001 16:12
const vs #define: Преимущества есть как у одного определения, так и у другого, важно грамотно ими пользоваться.
Что скажете?
Pest
unregistered
P
Pest unregistered
24 года назад / 22 марта 2001 16:22
const и #define - IMHO совершенно разные вещи и их использование для создания именованых констант - лишь малая часть сходства, примерно так-же можно рассуждать о шаблонах и #define
wdraco
unregistered
w
wdraco unregistered
24 года назад / 22 марта 2001 16:25
Pest
ок - тема

inline + template + const vs #define !!!

не звучит...

RQ
unregistered
R
RQ unregistered
24 года назад / 22 марта 2001 16:40
сonst для удобство компоновки, и удобен тем что к нему обращения идет по адресу а
Define он встраивается ( он не удобен потому что затрудняет работу с отладчиком)

Исправлено: RQ, 22-03-2001 16:41

-=ret=-
unregistered
r
-=ret=- unregistered
24 года назад / 22 марта 2001 16:43
мой взгляд такой:
1) пользоваться ими надо, что бы повысить читабельность кода
2) что бы изменения в программу (связанные с различными настройками) вносить в программу в одно месте программы.

Приимущества #define xxx 10
1) компилятор подставит ету саму 10 на стадии компиляции
2) 10 потом можно заменить (если уж очень припрет, а особенно в большом проекте на (myfunc() + 2 * myfunc2() + ... - ...) Хотя это не есть хорошо.
недостаток ну не понятно, какого типа ета самая 10 :(, что тоже может потом сказаться.

приимущества const:
c типом стало все впорядке
недостатки:
подстановка происходит на стадии выполнения программы, что скорости, конечно, не добавляет. Однако, что то вспоминается про объявление static const, где эта проблема решается

ну вроде и все,
вообщем использовать можно и то и другое, главное чотко представлять для чего и последствия :)))

Pest
unregistered
P
Pest unregistered
24 года назад / 22 марта 2001 16:45
wdraco

Конечно не звучит! уже давно

wdraco
unregistered
w
wdraco unregistered
24 года назад / 22 марта 2001 16:52
RQ
const может быть полностью исключен, если ты никогда не возьмешь его ссылки. Если возьмешь - то компилер обязан разместить его в памяти.

-=ret=-
const - всегда имеет локальное связывание, пока не явно не объявлена extern

wdraco
unregistered
w
wdraco unregistered
24 года назад / 22 марта 2001 16:54
Pest
ишь как много пришлось напридумывать чтобы избавиться от #define
RQ
unregistered
R
RQ unregistered
24 года назад / 22 марта 2001 16:59
ALL
Это бесконечный спор, на подобия
amd vs intel
BCB vs VC++
Pascal vs C++

-=ret=-
unregistered
r
-=ret=- unregistered
24 года назад / 22 марта 2001 17:05
RQ
да нет не бесконечный, просто, я надеюсь, многие из этого спора что-нибудь почерпнут для себя полезного :))))
(включая меня, конечно)
wdraco
unregistered
w
wdraco unregistered
24 года назад / 22 марта 2001 17:08
Пердлагаю по-другому взглянуть на тему:

скажем, что const int a = 10; - предпочтительнее в виду стандарта языка.

КОГДА и ПОЧЕМУ выгоднее использовать #define a 10 (или как-то еще)?

-=ret=-
unregistered
r
-=ret=- unregistered
24 года назад / 22 марта 2001 17:22
wdraco
может быть я и не прав, но кажется мне, что, в случае
while (условие) //ну очень много раз повторять
{
if(что-то1 > a1 && что-то2 < a2 ... что-тоN == an)
}
если мы опишем a1 .. an через #DEFINE работать будет быстрее :) нет? ;)
Pest
unregistered
P
Pest unregistered
24 года назад / 22 марта 2001 17:27
wdraco
-=ret=-
Если дело дошло до такой оптимизации по скорости, то позвольте поинтересоваться - какие программы пишем? а вообще чаще программки наши тормозно работают по причине неправильных архитектурных решений
RQ
unregistered
R
RQ unregistered
24 года назад / 22 марта 2001 17:41
В стандарте (ISO/IEC 14882) было сказано по меньше пользоваться макросами,
потому что они якобы свидетельствует о не достатке языка программирования.
Лично я не пользуюсь этим макросом , разве что для определения виндосовских сообщений.
А вот const, пользуюсь часто (для определения версий чего не будь)

//
#define WM_MYCMD 0x0401
//
#define APP_NAME "My APP"
//
const int App_Ver 1101

wdraco
unregistered
w
wdraco unregistered
24 года назад / 22 марта 2001 17:57
Pest
ничего не говорил об оптимизации.

-=ret=-
if(что-то1 > a1 && что-то2 < a2 ... что-тоN == an) не будет быстрее, так как компилятор подставит значения константы, так же, как и #define.

код:

const int ci = 10;
if(f()<ci) {
cout << "1" << endl;
}

disasm: (Borland C++ Builder 5)

код:

// if(f()<ci) {
call f()
cmp eax,0x0a
jnl Label


P.S. Естественно, если нигде нет const type * ap = &a1, и a1 не объявлено extern.

Исправлено: wdraco, 22-03-2001 18:16

-=ret=-
unregistered
r
-=ret=- unregistered
24 года назад / 22 марта 2001 17:59
ну наверное через #define удобно объявлять
#define FLAG_W_RUKI 0x0001
#define FLAG_IZ_RUK 0x0002

а вообще, группу флагов, скорее всего лучше объявлять так
enum FLAGI{FLAG_W_RUKI = 0x0001, ....};

и в программе точно не перепутаешь
void my_func(FLAGI fl)
{

}

и не передашь туда PULYA_W_LOB :)))

-=ret=-
unregistered
r
-=ret=- unregistered
24 года назад / 22 марта 2001 18:06
2wdraco
вполне может быть, что и подставит :) надо посмотреть.......
RQ
unregistered
R
RQ unregistered
24 года назад / 22 марта 2001 18:12
Ну без этого не как

#ifdef __BORLANDC__
//Что то
#endif


или

#ifndef My_H
#define My_H

#endif

Исправлено: RQ, 22-03-2001 18:14

Pest
unregistered
P
Pest unregistered
  24 года назад / 22 марта 2001 18:13
а еще можно использовать директивы #undef, #ifdef и так все запутать !!
Pest
unregistered
P
Pest unregistered
24 года назад / 22 марта 2001 18:15
RQ
к управлению компиляцией мое предыдущее высказывание не относится!
RQ
unregistered
R
RQ unregistered
24 года назад / 22 марта 2001 18:23
Pest
ok, Больше не буду
wdraco
unregistered
w
wdraco unregistered
24 года назад / 22 марта 2001 18:27
-=ret=-
итак, при перечислении набора значений предлагается использовать enum а не #define... гут. мне нравится.

RQ
предлагается оставить #define при работе с исходниками на C, чтобы не вносить путаницу в исходники.

этот "за" пока что единственный в списке.

RQ
unregistered
R
RQ unregistered
24 года назад / 22 марта 2001 18:32
wdraco
а
extern "C" {
#include "my_c_code.h"
}
wdraco
unregistered
w
wdraco unregistered
24 года назад / 22 марта 2001 18:39
RQ
guard-ы даже обсуждать нечего - без них не обойтись пока что.
RQ
unregistered
R
RQ unregistered
24 года назад / 22 марта 2001 18:50
wdraco


//8 байт
#define ABC "AAAA"
//10 байт
const AB_C = "AAAA";

RQ
unregistered
R
RQ unregistered
24 года назад / 22 марта 2001 19:20
#define MYMACRO(a,b) \
if (ab) func()

if (chto_ne_bud)
MYMACRO(foo,bar);
else
bug();
// Здесь возникнет ошибка, потому что

if (chto_ne_bud)
if (ab) func();
else bug(); //А мы этого не хотели

А с inline такого не будить

inline cool (a, b){
if(ab) func();

}
if (chto_ne_bud)
cool();
else Nobug(); // Все нормально


#define ujas(C) ( (C) >= 0 ? (C) : -(C) )
inline int ok(int C){
return C >= 0 ? C : -C;
}

int abc;
abc = ujas(x++); //Здесь возникнет ошибка
abc = ok(x++); //Здесь все OK

wdraco
unregistered
w
wdraco unregistered
24 года назад / 22 марта 2001 19:33
Так, значит предлагается за счет использования #define уменьшить объём исходников на несколько байт на каждое объявление, что конкретно зависит от длины имени типа константной переменной. (А уменьшение объема исходников не всегда есть плюс )

чтож рассматривая его как шутку предлагаю не увеличивать число плюсов #define-а гыгы

вот ёж-моёж!!! Кто-то же пользует #define-ы!!! неужто нельзя привести еще плюсов в их использовании?

RQ
unregistered
R
RQ unregistered
24 года назад / 22 марта 2001 19:44
wdraco
ВЫ вообще пользуетесь #define-ом, и зачем ?
wdraco
unregistered
w
wdraco unregistered
24 года назад / 22 марта 2001 20:12
RQ
лично я пользуюсь им исключительно в:
при соблюдении общепринятых правил именования в проекте - т.е. не ввожу своих const-ов, когда кругом #define, в т.ч. и при программировании под виндовзу в MSVC

стандартные макросы типа assert - чтобы исключить компиляцию исходников когда это не надо + гарды + условная компиляция + extern "C" + прочее без чего не обойтись попросту.

в своих проектах я не пользую #define для создания констант вообще, и до сих пор не испытывал от этого неудобств. Потому мне вдвойне интересней услышать доводы в пользу их использования

-=ret=-
unregistered
r
-=ret=- unregistered
24 года назад / 22 марта 2001 20:23
честно говоря, для объявления констант определенного вида (флагов каких-нидь) обычно использую enum.
KBAKEP
Junior Member
24 года на iXBT, с ноября 2000
18 фото на iXBT.photo
Чаще пишет в "Процессоры" (23%)
Россия, Саратов
Инфо
K
KBAKEP Junior Member
  24 года назад / 22 марта 2001 20:31
Дабы как-то поучаствовать и привлечь внимание специалистов (да простят меня за наглое вмешательство последние) как вам кусочек кода в теме
http://forum.ixbt.com/0026/001741.html
RQ
unregistered
R
RQ unregistered
24 года назад / 22 марта 2001 20:36
wdraco
Я сказать в их ползу, не могу, как сам ими почти не пользуюсь, может подождать не много и кто-то добавить что-то интересное.
Serjyk
Member
25 лет на iXBT, с ноября 1999
Чаще пишет в "Общий" (41%)
Инфо
S
Serjyk Member
24 года назад / 22 марта 2001 20:54
Привожу пример "живого" эксплуатируемого кода.
#define SET_SENTVALUE(Par) ((AA*)v)->as->Set.Par = ((AA*)v)->nPar
void vOkGTV ( void *v ) { SET_SENTVALUE(nVial); vContinueStep(v); }
void vOkSYR ( void *v ) { SET_SENTVALUE(nSyrPos); vContinueStep(v); }
void vOkNDL ( void *v ) { SET_SENTVALUE(nNdlPos); vContinueStep(v); }
void vOkVLV ( void *v ) { SET_SENTVALUE(vvPos); vContinueStep(v); }
void vOkPVL ( void *v ) { SET_SENTVALUE(pvPos); vContinueStep(v); }
void vOkSSP ( void *v ) { SET_SENTVALUE(spFlow); vContinueStep(v); }
void vOkSAM ( void *v ) { SET_SENTVALUE(wTraySize); vContinueStep(v); }
void vOkSIZ ( void *v ) { SET_SENTVALUE(wSyrSize); vContinueStep(v); }
void vOkSSIP ( void *v ) { SET_SENTVALUE(nALFlowRate); vContinueStep(v); }
void vOkSTT ( void *v ) { SET_SENTVALUE(nTrayTemp); vContinueStep(v); }
void vOkTPCL ( void *v ) { SET_SENTVALUE(tmState); vContinueStep(v); }
#undef SET_SENTVALUE
Из-за привязки к существующим наработкам эти callback-функции невозможно определить, как

void func ( struct AA* ) вместо void func ( void* ).

Чтобы не плодить байты исходного кода с обращением к полям трехэтажных структур, пришлось прибегнуть к помощи вышеописанного макроса.

А если бы таких функций было штук так 50..60?

Вообще то этот спор о возможности-невозможности жизни без использования #define похож на дискуссию а нужен ли оператор goto в ЯП C? Математически доказано, что любой алгоритм на Сях можно реализовать без использования goto. Но бывают некоторые специфические моменты, когда использование goto может довольно ощутимо сократить объем кода и повысить его читабельность в многоуровневых вложениях типа if-else. Я сам за всю свою профессиональную историю использовал goto от силы раз 10 или меньше. Но в каждом случае его использования это действительно приносило выгоду в уменьшении длины объектного кода на 50..300 байт и повышении читабельности исходного кода в каждом случае.

Поэтому, my private opinion есть то что #define, как и goto использовать можно, но увлекаться этим не стоит.

Практика - критерий истины. (c) не мой.

wdraco
unregistered
w
wdraco unregistered
24 года назад / 23 марта 2001 06:45
RQ
вот и я жду

KBAKEP
ужасный кусочек. а что если n=100?

RQ
unregistered
R
RQ unregistered
24 года назад / 23 марта 2001 07:00
wdraco
Я тоже
backspace
unregistered
b
backspace unregistered
24 года назад / 23 марта 2001 13:51
Serjyk
А так еще короче
код:

#define IMPL_CALLBACK(func,ident) \
void vOk##func( void *v ) { SET_SENTVALUE(ident); vContinueStep(v); }

IMPL_CALLBACK(GTV,nVial)
//...
IMPL_CALLBACK(TPCL,tmState)

#undef IMPL_CALLBACK

Исправлено: backspace, 23-03-2001 13:53

Если Вы считаете это сообщение ценным для дискуссии (не обязательно с ним соглашаться), Вы можете поблагодарить его автора, а также перечислить ему на счет некоторую сумму со своего баланса (при отзыве благодарности перечисленная сумма не будет вам возвращена).
Также вы можете оценить сообщение как неудачное.
В течение суток можно 20 раз оценить сообщения разных участников (купите Premium-аккаунт, либо оплачивайте оценки сверх лимита).
Страницы:Кликните, чтобы указать произвольную страницу12далее
Эта тема расположена в архиве и закрыта для обсуждения.