|
Стиль программирования на Си, описание функции |
|
|
|
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, 12:48
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата Во всех случаях, где можно выбирать, предпочтительнее использовать средства компилятора, а не препроцессора. Использование препроцессора нужно свести к минимуму, в идеале исключить вообще. Просветите, плз, откуда такая категоричная постановка? Цитата По большому счету препроцессор имеет смысл использовать только для реализации условной компиляции да простеньких макроподстановок типа вставки платформенно-зависимых квалификаторов. Почему-то приходится применять гораздо шире. Где не вижу тонкой грани?
--------------------
aka Vit
|
|
|
|
|
Apr 1 2008, 03:41
|

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

|
Цитата(sensor_ua @ Mar 31 2008, 19:48)  Просветите, плз, откуда такая категоричная постановка? Уже неоднократно на эту тему проходились, повторять не охота, воспользуйтесь поиском. Вкратце. Макроподстановка таит в себе опасность из-за того, что делается тупо, без контроля типов и контекста, в котром она производится. При этом пользователь видит одно, а получает другое. Наглядный пример тому - соседняя ветка про вычисления в макросах, когда пара лишних скобок меняла контекст выражения и вычисление выражения с этапа компиляции переносилось на этап выполнения программы, что предъявляло совершенно другие требования по потреблению стека, в частности. Причем все это происходит скрытно от пользователя, в этом и подлость. Отсутствие анализа контекста несет еще косяки - недавно обсуждали: например, фирма IAR ввела для некоторых новых чипов AVR макроопределения в заголовочных файлах ioxxx.h типа Код #define N 2 #define C 0 Теперь, если пользователь использует где-то внутри, в недрах функций (да хоть в списке аргументов прототипов) простое короткое имя N или C, то все, привет. Причем, в ряде случаев весьма неочевидно, в чем ошибка. И хорошо, если еще компилятор заругается на что-то, а то ведь может и прокатить компиляция, а в железе не работает. Вот тут попляшешь с бубном. А все потому, что препроцессор работает тупо и кладет на пространства имен, контекст выражения и делает свою работу скрытно. Некоторое время назад попался прикол (возможно байка, но все равно забавно): в исходниках, оставшихся от недавно уволенного программиста после долгой и болезненной отладки обнаужили такую сточку в одном из заголовочных файлов: Код #define TRUE FALSE // счастливой отладки, суки Список примеров можно продолжать, то повторять не хочется, уже обсуждалось не раз. Короче, макроподстановки могут приводить и приводят к труднообнаруживаемым, подлым ошибкам и несут неконтролируемое (и часто слабопредсказуемое) поведение. По этим причинам использование макроподстановок должно быть минимизировано до уровня минимально необходимого, без которого реально не обойтись. Сюда относятся простые макросы, без сложных выражений, задающие порядок условной компиляции, и другие простые замены, часто используемые при портировании. Это практически все, никаких констант, никаких макрофункций быть не должно. Цитата(sensor_ua @ Mar 31 2008, 19:48)  Почему-то приходится применять гораздо шире. Где не вижу тонкой грани? А вот мне не приходится. И все получается. Приходится применять только в рамках вышеописанного - для условной компиляции и простых подстановок при портировании. Псевдонимы типов прекрасно решаются с помощью typedef, о чем уже сказали. Макросы-литералы замечательно заменяются настоящими типизированными константами. При этом никакого оверхеда не возникает - если нет попытки взять адрес константного объекта или завести ссылку на него, то компилятор не будет его размещать в памяти. Правда, это относится к С++, где у констант по умолчанию внутреннее связывание. Но, думается, сегодня уже нет проблем использовать плюсатый компилятор. В случае с С для получения такого же поведения константные объекты придется обзывать дополнительно static. Макросы-функции без проблем заменяются встраиваемыми ( inline) функциями. Это на сегодняшний день штатно умеют уже не только С++, но и С компиляторы. По Стандарту. Если требуются какие-то нетривиальные вычисления и надо, чтобы они гарантировано производились на этапе компиляции (во избежание оверхеда), то существует мнение (и я его придерживаюсь), что такие вещи лучше вообще выполнять внешними инструментами и подсовывать компилятору уже готовые значения (потому как компилятор - не калькулятор). Через опцию -D, либо вообще поместив их в отдельный файл, который включается в проект. При использовании систем сборки (make, scons) технических трудностей не возникает никаких. Да и с оболочками тоже проблем во многих случаях нет. В любом случае не слишком разумно заставлять пыжиться целочисленный препроцессор с его 32-битной арифметикой - он отомстит (что часто и происходит).  Если все это вас не убедило, поищите в сети мнение авторитетного дяденьки Б.Страуструпа (автора языка С++), возможно, он подробнее объяснит.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
Сообщений в этой теме
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 rezident Извиняюсь, что вклиниваюсь.
Цитата(sensor_ua ... Mar 31 2008, 14:13 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 Lem препроцессором не рекомендуется пользоваться именн... Mar 31 2008, 20:08 ReAl Цитата(Lem @ Mar 31 2008, 22:08) как во ч... Apr 1 2008, 12:40  dxp Цитата(ReAl @ Apr 1 2008, 19:40) Как прав... Apr 1 2008, 13:50   Сергей Борщ Цитата(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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|