|
Стиль программирования на Си, описание функции |
|
|
|
Mar 31 2008, 10:23
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Добрый день! Столкнулся со следующей проблемой. нашол код как сделать восемь таймеров написанный Alechin Jan. Первое что кидается в глаза та это синтаксис мне непонятный. Вот к примеру прототип функции остановки тай мера: Код void Stop_Timer(IN IDX timer); ну и сама функция: Код /*--------------------------------------------------------------------------------------------*/ /* Процедура остановки таймера. */ /* Принимает: номер таймера (0 - 7). */ /* Возвращает: ничего не возвращает. */ /*--------------------------------------------------------------------------------------------*/ __monitor void Stop_Timer(IN IDX timer) { Timer[timer].Timer_Ena = TIMER_DIS; return; } Непонятно что такое IDX? Ну IN понятно, направление, очень удобно. IDX по ходу здесь беззнаковый чар. Ну и соответственно вопрос: Этот синтаксис возможен через какоето макроопределение? Может кто знает, подскажите, уверен это интерессно не только мне. Вот ещё пример Код void Start_Timer(IN IDX timer, IN WORD interval, IN pTIMER_FUNC pFunc = NULL, IN bool cycle = TIMER_ONCE); Спасибо.
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
 |
Ответов
|
Mar 31 2008, 20:08
|
Участник

Группа: Участник
Сообщений: 37
Регистрация: 20-03-05
Пользователь №: 3 533

|
препроцессором не рекомендуется пользоваться именно из-за проблем с поиском ошибок (в основном), так как во что разворачивается макроопределение выяснить практически нереально (достоверно), отлаживаться и искать ошибки крайне неудобно. Поэтому были введены в язык средства, позволяющие практически полностью исключить использование препроцессора. Список случаев, когда препроцессор оправдан уже был озвучен.
Правда, я лично использую его неправильно, надо отучаться... Для маленьких проектов, например, для микроконтроллеров типа АВР, разницы никакой, но привычка переносится и на большие, а там проявляются все эти кажущиеся надуманными проблемы.
|
|
|
|
|
Apr 1 2008, 12:40
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(Lem @ Mar 31 2008, 22:08)  как во что разворачивается макроопределение выяснить практически нереально (достоверно) Как правило препроцессор идёт отдельным исполняемым файлом и/или у компилятора есть соответствующий ключик "выполнить только препроцессор". И можно получить выход препроцессора и всё поразглядывать. Да, очень много чего можно затолкать в enum-ы, inline-функции и т.п. Да, в С++ есть ссылки, позволяющие уменьшить использование указателей и связанных с неправильным их применением ошибок (ударение на слове "неправильным", а не на слове "применением"). И т.д. и т.п. Но, извините, #define TRUE FALSE и #define SQR(x) x * x это примеры вредительского и безграмотного применения макросов, а не их генетической ущербности. Но на их базе строится рекомендация "использование макросов следует уменьшать в идеале до нуля", что, на мой взгляд, неправильно, как неправильны и рекомендации не использовать указатели (а почему тогда в стандарте оставили не только условную компиляцию, но и функциональные макросы, склейку и подстановку аргументов и оставили указатели?) Так же как и с goto, который я использую редко и на форумах иногда сам привожу примеры, как можно обойтись без goto и при этом и сгенерированный код не растёт, и читаемость улучшается, но который я инода таки использую - так же и с макросами: Используйте, не бездумно, голова дана именно для выбора нужного средства языка!(Кстати, а какое средство языка можно использовать бездумно? Знаменитые примеры "индусского" кода написаны и без макросов, и без gotoи часто вообще на яве, изначально "лишённой недостатков С/С++")Правильно и в нужном месте применённые макросы, на мой взгляд, только улучшают (не слишком хорошо формализуемый и очень вкусовой параметр) читаемость кода. Кончено, для людей, умеющих с ними обращаться (та же проблема с указателями). Огрызок .h Код typedef WINAPI void (*DlPortWritePortUchar_t) (unsigned port, uint8_t d); typedef WINAPI uint8_t (*DlPortReadPortUchar_t) (unsigned port); typedef WINAPI void (*DlPortWritePortBufferUchar_t) (unsigned port, const uint8_t *pd, int len);
class lpt_dlportio_t : public lpt_io_t { public: lpt_dlportio_t(unsigned _base); ~lpt_dlportio_t();
virtual uint8_t read(rd_offset offs); virtual void write(wr_offset offs, uint8_t d); virtual void write_data(const uint8_t *pd, int len);
private: HINSTANCE hdlportio; #define _DL_PTR(_f_) _f_##_t _f_##_P _DL_PTR(DlPortWritePortUchar); _DL_PTR(DlPortReadPortUchar); _DL_PTR(DlPortWritePortBufferUchar); #undef _DL_PTR }; // class lpt_dlportio_t Огрызок .cpp Код lpt_dlportio_t::lpt_dlportio_t(unsigned _base) : lpt_io_t(_base), hdlportio(NULL) { hdlportio = LoadLibrary("DLportIO.dll"); if (hdlportio == NULL) throw error_win32_t(E_INVHARD, "Can't load port access library `DLportIO.dll'");
#define _DL_LOAD(_f_)\ do {\ _f_##_P = (_f_##_t)GetProcAddress(hdlportio, #_f_);\ if(_f_##_P == NULL)\ throw error_win32_t(E_INVHARD, "Can't load port access library `DLportIO.dll'"); \ } while(0)
_DL_LOAD(DlPortWritePortUchar); _DL_LOAD(DlPortReadPortUchar); _DL_LOAD(DlPortWritePortBufferUchar); #undef _DL_LOAD
} // lpt_dlportio_t::lpt_dlportio_t И не говорите мне, что этот текст надо переписать без макросов для облегчения чтения и сопровождения (представим себе, что понадобилось добавить ещё одну функцию из dlportio.dll и/или изменить обработку ошибки - в каком случае надо больше до-/пере-писывать руками и где при этом больше шансов ошибиться в одной из ветвей - в варианте с макросами или с прямым текстом? И ещё пример на эту тему http://www.telesys.ru/wwwboards/mcontrol/1...es/314290.shtml
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Apr 1 2008, 13:50
|

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

|
Цитата(ReAl @ Apr 1 2008, 19:40)  Как правило препроцессор идёт отдельным исполняемым файлом и/или у компилятора есть соответствующий ключик "выполнить только препроцессор". Это где такое правило? В GCC? Рад за него. В IAR с некоторых пор появился ключик. А вот в используемом мной сейчас VDSP такого удовольствия нет (не нашел). Т.ч. тут как повезет. Цитата(ReAl @ Apr 1 2008, 19:40)  Да, очень много чего можно затолкать в enum-ы, inline-функции и т.п. Именно!  И все, что можно туда затолкать, не надо пихать в макросы. Об этом и спич. Цитата(ReAl @ Apr 1 2008, 19:40)  Но, извините, #define TRUE FALSE Да это я вообще в качестве хохмы привел, не апеллируя к этому примеру, как к аргументу. Просто этот пример наглядно демонстрирует мощь препроцессора как дестуктивного средства, только и всего. Цитата(ReAl @ Apr 1 2008, 19:40)  это примеры вредительского и безграмотного применения макросов, а не их генетической ущербности. Как насчет вышеприведенного примера про Код #define I 7 #define N 2 #define C 0 ? А ведь это не лохи какие-то делали, а вполне серьезная и уважаемая фирма IAR Systems, которая выпускает очень достойные продукты. Замечательные грабли. Замечательный пример той же самой деструктивной мощи. Да, препроцессор обладает известной гибкостью в силу своих свойств по текстовой подстановке, но это палка о двух концах. Не стоит злоупотрелять ею. Имхо, "генетическая ущербность" препроцессора в том, что он делает свою работу тупо, без анализа, не обращая внимания на простнаства имен и прочий контекст, о чем уже в этой же ветке было не раз говорено. Цитата(ReAl @ Apr 1 2008, 19:40)  Но на их базе строится рекомендация "использование макросов следует уменьшать в идеале до нуля", Да. Но идеал недостижим. Поэтому препроцессор останется. Цитата(ReAl @ Apr 1 2008, 19:40)  (а почему тогда в стандарте оставили не только условную компиляцию, Потому, что для нее нет адекватной замены. Цитата(ReAl @ Apr 1 2008, 19:40)  но и функциональные макросы, склейку и подстановку аргументов Совместимость и преемственность. Попробуй убери что-нить из этого - миллионы строк кода уже написанного, отлаженного и работающего кода сразу перестанут компилироваться. Цитата(ReAl @ Apr 1 2008, 19:40)  и оставили указатели?) Указатели из другой оперы, не надо все в кучу валить. Еще спроси (ехидно так), зачем оставили ассемблер - там тоже можно при невнимательном обращении наворотить.  Цитата(ReAl @ Apr 1 2008, 19:40)  Так же как и с goto, который я использую редко Реально есть одна ситуация, где без него геморно - выход из вложенного цикла. Вроде все, больше не знаю (навскидку). Из-за этого оный оператор и оставили в языке. Цитата(ReAl @ Apr 1 2008, 19:40)  так же и с макросами: Используйте, не бездумно, голова дана именно для выбора нужного средства языка! Осталось найти, как добраться до головы иаровских разрабов, соорудивших макросы, приведенные выше.  Если есть возможность разложить грабли - они будут разложены. Раньше или позже, чаще или реже. Желательно, чтобы это было реже. Для этого использование препроцессора надо свести к минимуму, о чем только и речь. Никто не призывает отказаться от него вообще - это, повторяю, нереально. Чего в крайности кидаться. Цитата(ReAl @ Apr 1 2008, 19:40)  (Кстати, а какое средство языка можно использовать бездумно? Знаменитые примеры "индусского" кода написаны и без макросов, и без gotoи часто вообще на яве, изначально "лишённой недостатков С/С++") Коренное отличие многих среств языка от средств препроцессора в том, что с ними код читается без подводных граблей. Сразу видно, как используется средство, сразу понятно, что тут можно ожидать. А вот с препроцессором оно несколько не так. Цитата(ReAl @ Apr 1 2008, 19:40)  И не говорите мне, что этот текст надо переписать без макросов для облегчения чтения и сопровождения (представим себе, что понадобилось добавить ещё одну функцию из dlportio.dll и/или изменить обработку ошибки - в каком случае надо больше до-/пере-писывать руками и где при этом больше шансов ошибиться в одной из ветвей - в варианте с макросами или с прямым текстом? Это большой вопрос, как лучше, пример не убеждает. Насчет руками - про рефакторинг слышал? Кроме того, тут пример очень осторожного использования - определение макроса лежит прямо тут же, все перед глазами. Но не дай бог кто-нить вздумает использовать такое же имя _DL_PTR в своей программе. Будет удивлен.  Т.ч. тут тоже есть, что обсудить. Цитата(ReAl @ Apr 1 2008, 20:40)  Ну в такой формулировке - с указанием где именно и без абсолютной категоричности - можно согласиться :-) Но ведь обычно идёт разговор "запретить и всё тут, так как это источник ошибок". Это где это сказано, что "запретить" и все тут? Сказано было, свести к минимуму.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
Сообщений в этой теме
sKWO Стиль программирования на Си Mar 31 2008, 10:23 Axxel Цитата(sKWO @ Mar 31 2008, 16:23) Этот си... Mar 31 2008, 10:36 aaarrr Стиль жуткий, не надо так делать.
Цитата(Axxel ... Mar 31 2008, 10:40 defunct ЦитатаЭтот синтаксис возможен через какоето макроо... Mar 31 2008, 10:59 sKWO Цитата(defunct @ Mar 31 2008, 14:59) да, ... Mar 31 2008, 11:56  dxp Цитата(sKWO @ Mar 31 2008, 18:56) Да, тог... Mar 31 2008, 12:16  defunct Цитата(sKWO @ Mar 31 2008, 13:56) Чёта му... Mar 31 2008, 14:17  Axxel Цитата(sKWO @ Mar 31 2008, 17:56) ПОКАЖИ
... Apr 1 2008, 04:30 sensor_ua ЦитатаВо всех случаях, где можно выбирать, предпоч... Mar 31 2008, 12:48 rezident Извиняюсь, что вклиниваюсь.
Цитата(sensor_ua ... Mar 31 2008, 14:13 dxp Цитата(sensor_ua @ Mar 31 2008, 19:48) Пр... Apr 1 2008, 03:41 Alechin Так как кусок кода мой - скажу как это описано у м... Mar 31 2008, 14:08 sensor_ua ЦитатаДля переносимости кода....
IMNHO, совсем неу... Mar 31 2008, 14:39 rezident Цитата(sensor_ua @ Mar 31 2008, 20:39) IM... Mar 31 2008, 14:51 vshemm Есть замечательная книга Алена Голуба "Правил... Mar 31 2008, 15:08 sensor_ua ЦитатаУже были и неоднократно пояснения почему typ... Mar 31 2008, 15:23 sKWO Спасибо, Ребята! Дисскусия разворачивается хор... Mar 31 2008, 16:51 sensor_ua Попробуй таки найти текстовым поиском "#defin... Mar 31 2008, 17:10 rezident Цитата(sensor_ua @ Mar 31 2008, 23:10) По... Mar 31 2008, 17:12 sensor_ua ЦитатаА вот на такое безобразие препроцессор сруга... Mar 31 2008, 17:26 rezident Цитата(sensor_ua @ Mar 31 2008, 23:26) А ... Mar 31 2008, 18:49 sensor_ua Гы Мне код перебивать не нужно. Мне как раз единож... Mar 31 2008, 19:07   Сергей Борщ Цитата(dxp @ Apr 1 2008, 16:50) Осталось ... Apr 1 2008, 14:43   ReAl Цитата(dxp @ Apr 1 2008, 15:50) Это где т... Apr 1 2008, 14:51   zltigo Цитата(dxp @ Apr 1 2008, 16:50) А вот в и... Apr 1 2008, 20:44    SasaVitebsk Цитата(zltigo @ Apr 2 2008, 00:44) Рекоме... Apr 1 2008, 22:17     _Pasha Цитата(SasaVitebsk @ Apr 2 2008, 01:17) П... Apr 2 2008, 06:58    ReAl Цитата(zltigo @ Apr 1 2008, 22:44) Самост... Apr 2 2008, 11:55     defunct Цитата(ReAl @ Apr 2 2008, 13:55)
Шаманим... Apr 2 2008, 12:15      ReAl Цитата(defunct @ Apr 2 2008, 14:15) Это я... Apr 2 2008, 12:40       defunct Цитата(ReAl @ Apr 2 2008, 14:40) Фух, а т... Apr 2 2008, 12:43       _Pasha Цитата(ReAl @ Apr 2 2008, 15:40) ...спосо... Apr 2 2008, 18:53     zltigo Цитата(ReAl @ Apr 2 2008, 14:55) По повод... Apr 2 2008, 15:01      sKWO Позволю небольшой отрывок кода, извиняюсь что немн... Apr 2 2008, 16:40 sensor_ua Цитатапрепроцессором не рекомендуется пользоваться... Mar 31 2008, 20:29 _Pasha Цитата(vshemm @ Mar 31 2008, 19:08) Так т... Mar 31 2008, 22:07 sensor_ua ЦитатаУже неоднократно на эту тему проходились, по... Apr 1 2008, 05:53 Dog Pawlowa Цитата(sensor_ua @ Apr 1 2008, 08:53) Про... Apr 1 2008, 06:30 dxp Цитата(sensor_ua @ Apr 1 2008, 12:53) А в... Apr 1 2008, 07:01 _Pasha Пример winavr
Кодeeprom_read_block(&my_var... Apr 1 2008, 06:16 _Pasha Цитата(sensor_ua @ Apr 1 2008, 09:53) К с... Apr 1 2008, 06:33 sensor_ua ЦитатаНо это, повторяю, другое
Дальше бессмысленно... Apr 1 2008, 08:17 dxp Цитата(sensor_ua @ Apr 1 2008, 15:17) Дал... Apr 1 2008, 09:28 SasaVitebsk Очень интересная дискуссия развернулась. Но, в общ... Apr 1 2008, 12:48 dxp Цитата(SasaVitebsk @ Apr 1 2008, 19:48) Н... Apr 1 2008, 13:11  ReAl Цитата(dxp @ Apr 1 2008, 15:11) Во всяком... Apr 1 2008, 13:40   defunct Цитата(ReAl @ Apr 1 2008, 15:40) Но ведь ... Apr 2 2008, 09:58    andrew_b Цитата(defunct @ Apr 2 2008, 12:58) Delph... Apr 2 2008, 10:15    Сергей Борщ Цитата(defunct @ Apr 2 2008, 12:58) Прост... Apr 2 2008, 12:34     defunct Цитата(Сергей Борщ @ Apr 2 2008, 14:34) Н... Apr 2 2008, 12:39 Сергей Борщ Цитата(SasaVitebsk @ Apr 1 2008, 15:48) К... Apr 1 2008, 13:15 Lem одним из авторитетов для меня является Герб Саттер... Apr 1 2008, 13:07 sensor_ua ЦитатаНе следует путать приятное с полезным...
Не ... Apr 1 2008, 13:37 SasaVitebsk Вот об этом я и говорю - богатство выбора в рамках... Apr 2 2008, 18:34 singlskv Цитата(SasaVitebsk @ Apr 2 2008, 22:34) С... Apr 2 2008, 19:19 zltigo Цитата(SasaVitebsk @ Apr 2 2008, 21:34) .... Apr 2 2008, 19:30  singlskv Цитата(zltigo @ Apr 2 2008, 23:30) Вы зна... Apr 2 2008, 20:31   zltigo Цитата(singlskv @ Apr 2 2008, 23:31) Да п... Apr 2 2008, 21:51    singlskv Цитата(zltigo @ Apr 3 2008, 01:47) Налицо... Apr 2 2008, 21:55     zltigo Цитата(singlskv @ Apr 3 2008, 00:55) пока... Apr 2 2008, 22:08      singlskv Цитата(zltigo @ Apr 3 2008, 02:08) и убра... Apr 2 2008, 22:37       ReAl Цитата(singlskv @ Apr 3 2008, 00:37) Я же... Apr 2 2008, 22:46        singlskv Цитата(ReAl @ Apr 3 2008, 02:32) Кстати, ... Apr 2 2008, 23:25         ReAl Цитата(singlskv @ Apr 3 2008, 00:55) Так ... Apr 2 2008, 23:45          defunct Цитата(ReAl @ Apr 3 2008, 01:45) Кстати, ... Apr 3 2008, 10:22       zltigo Цитата(singlskv @ Apr 3 2008, 01:37) это ... Apr 3 2008, 05:53     ReAl Цитата(singlskv @ Apr 2 2008, 23:55) с ОД... Apr 2 2008, 22:32  sKWO Цитата(zltigo @ Apr 2 2008, 22:30) Компил... Apr 7 2008, 10:40   ReAl Цитата(sKWO @ Apr 7 2008, 13:40) К пример... Apr 7 2008, 19:43    sKWO Цитата(ReAl @ Apr 7 2008, 22:43) Называет... Apr 8 2008, 11:00 SasaVitebsk Хотя я в NASA не работал, но по слухам там не прим... Apr 2 2008, 19:53 AlexKLm На СИ, правильно когда по-больше зелени (#define),... Apr 2 2008, 21:22 SasaVitebsk Вот я и говорю, что результат практически тот же п... Apr 3 2008, 07:23 ReAl Цитата(SasaVitebsk @ Apr 3 2008, 09:23) В... Apr 3 2008, 08:28 _Pasha Кто о чем, а вшивый - о бане...
Пробегала книжка ... Apr 3 2008, 12:57 sensor_ua Цитатасредствами ИАР это дело обстоит намного прощ... Apr 7 2008, 10:58 sKWO Цитата(sensor_ua @ Apr 7 2008, 13:58) А к... Apr 7 2008, 11:07 sensor_ua Не очень понял, что Вы хотите, но на телесистемах ... Apr 7 2008, 12:51 sKWO спасибо за инфу!! Apr 7 2008, 17:49
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|