Что скажете?
Nashev unregistered Автор темы | const vs #define: Преимущества есть как у одного определения, так и у другого, важно грамотно ими пользоваться. Что скажете? |
Pest unregistered | const и #define - IMHO совершенно разные вещи и их использование для создания именованых констант - лишь малая часть сходства, примерно так-же можно рассуждать о шаблонах и #define |
wdraco unregistered | Pest ок - тема inline + template + const vs #define !!! не звучит... |
RQ unregistered | сonst для удобство компоновки, и удобен тем что к нему обращения идет по адресу а Define он встраивается ( он не удобен потому что затрудняет работу с отладчиком) Исправлено: RQ, 22-03-2001 16:41 |
-=ret=- unregistered | мой взгляд такой: 1) пользоваться ими надо, что бы повысить читабельность кода 2) что бы изменения в программу (связанные с различными настройками) вносить в программу в одно месте программы. Приимущества #define xxx 10 приимущества const: ну вроде и все, |
Pest unregistered | wdraco Конечно не звучит! уже давно |
wdraco unregistered | RQ const может быть полностью исключен, если ты никогда не возьмешь его ссылки. Если возьмешь - то компилер обязан разместить его в памяти. -=ret=- |
wdraco unregistered | Pest ишь как много пришлось напридумывать чтобы избавиться от #define |
RQ unregistered | ALL Это бесконечный спор, на подобия amd vs intel BCB vs VC++ Pascal vs C++ |
-=ret=- unregistered | RQ да нет не бесконечный, просто, я надеюсь, многие из этого спора что-нибудь почерпнут для себя полезного :)))) (включая меня, конечно) |
wdraco unregistered | Пердлагаю по-другому взглянуть на тему: скажем, что const int a = 10; - предпочтительнее в виду стандарта языка. КОГДА и ПОЧЕМУ выгоднее использовать #define a 10 (или как-то еще)? |
-=ret=- unregistered | wdraco может быть я и не прав, но кажется мне, что, в случае while (условие) //ну очень много раз повторять { if(что-то1 > a1 && что-то2 < a2 ... что-тоN == an) } если мы опишем a1 .. an через #DEFINE работать будет быстрее :) нет? ;) |
Pest unregistered | wdraco -=ret=- Если дело дошло до такой оптимизации по скорости, то позвольте поинтересоваться - какие программы пишем? а вообще чаще программки наши тормозно работают по причине неправильных архитектурных решений |
RQ unregistered | В стандарте (ISO/IEC 14882) было сказано по меньше пользоваться макросами, потому что они якобы свидетельствует о не достатке языка программирования. Лично я не пользуюсь этим макросом , разве что для определения виндосовских сообщений. А вот const, пользуюсь часто (для определения версий чего не будь) // |
wdraco unregistered | Pest ничего не говорил об оптимизации. -=ret=- код: disasm: (Borland C++ Builder 5) код:
Исправлено: wdraco, 22-03-2001 18:16 |
-=ret=- unregistered | ну наверное через #define удобно объявлять #define FLAG_W_RUKI 0x0001 #define FLAG_IZ_RUK 0x0002 а вообще, группу флагов, скорее всего лучше объявлять так и в программе точно не перепутаешь } и не передашь туда PULYA_W_LOB :))) |
-=ret=- unregistered | 2wdraco вполне может быть, что и подставит :) надо посмотреть....... |
RQ unregistered | Ну без этого не как #ifdef __BORLANDC__
#ifndef My_H #endif Исправлено: RQ, 22-03-2001 18:14 |
Pest unregistered | а еще можно использовать директивы #undef, #ifdef и так все запутать !! |
Pest unregistered | RQ к управлению компиляцией мое предыдущее высказывание не относится! |
RQ unregistered | Pest ok, Больше не буду |
wdraco unregistered | -=ret=- итак, при перечислении набора значений предлагается использовать enum а не #define... гут. мне нравится. RQ этот "за" пока что единственный в списке. |
RQ unregistered | wdraco а extern "C" { #include "my_c_code.h" } |
wdraco unregistered | RQ guard-ы даже обсуждать нечего - без них не обойтись пока что. |
RQ unregistered | wdraco
|
RQ unregistered | #define MYMACRO(a,b) \ if (ab) func() if (chto_ne_bud) if (chto_ne_bud) inline cool (a, b){ }
int abc; |
wdraco unregistered | Так, значит предлагается за счет использования #define уменьшить объём исходников на несколько байт на каждое объявление, что конкретно зависит от длины имени типа константной переменной. (А уменьшение объема исходников не всегда есть плюс чтож рассматривая его как шутку предлагаю не увеличивать число плюсов #define-а вот ёж-моёж!!! Кто-то же пользует #define-ы!!! неужто нельзя привести еще плюсов в их использовании? |
RQ unregistered | wdraco ВЫ вообще пользуетесь #define-ом, и зачем ? |
wdraco unregistered | RQ лично я пользуюсь им исключительно в: при соблюдении общепринятых правил именования в проекте - т.е. не ввожу своих const-ов, когда кругом #define, в т.ч. и при программировании под виндовзу в MSVC стандартные макросы типа assert - чтобы исключить компиляцию исходников когда это не надо + гарды + условная компиляция + extern "C" + прочее без чего не обойтись попросту. в своих проектах я не пользую #define для создания констант вообще, и до сих пор не испытывал от этого неудобств. Потому мне вдвойне интересней услышать доводы в пользу их использования |
-=ret=- unregistered | честно говоря, для объявления констант определенного вида (флагов каких-нидь) обычно использую enum. |
KBAKEP Junior Member | Дабы как-то поучаствовать и привлечь внимание специалистов (да простят меня за наглое вмешательство последние) как вам кусочек кода в теме http://forum.ixbt.com/0026/001741.html |
RQ unregistered | wdraco Я сказать в их ползу, не могу, как сам ими почти не пользуюсь, может подождать не много и кто-то добавить что-то интересное. |
Serjyk Member 25 лет на iXBT, с ноября 1999 Чаще пишет в "Общий" (41%) | Привожу пример "живого" эксплуатируемого кода. #define SET_SENTVALUE(Par) ((AA*)v)->as->Set.Par = ((AA*)v)->nPar Из-за привязки к существующим наработкам эти callback-функции невозможно определить, как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 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 | RQ вот и я жду KBAKEP |
RQ unregistered | wdraco Я тоже |
backspace unregistered | Serjyk А так еще короче код: Исправлено: backspace, 23-03-2001 13:53 |