kosyak© 0 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба Занятная статья. do{}while(0) я видел в чужих исходниках пару раз - и никак не мог понять зачем? Спасибо, разъяснили.. Сам я тоже сторонник везде ставить фигурные скобки..потому ниразу на подобную ошибку и не натыкался. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба Сам я тоже сторонник везде ставить фигурные скобки..потому ниразу на подобную ошибку и не натыкался. А я, наоборот, сторонник минимализма. Не хочу писать ничего лишнего. Так мне красивее кажется. А за ссылку на статью - спасибо, MrYuran! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба Ну можно еще более универсальную штуку сочинить, типа: typedef void (*pVoidFun)(void); void Control_Indication(pVoidFun p) { if(p) p(); Indication(); } Тогда можно вызывать Control_Indication(NULL) - будет вызываться только Indication(), а при вызове типа Control_Indication(Control) сначала вызовется функция, адрес которой вы передали вызывающей функции, затем Indication(). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба ...а при вызове типа Control_Indication(Control) сначала вызовется функция, адрес которой вы передали вызывающей функции... Только Control() при этом должна быть отдельной функцией, иначе указатель на нее не создать. :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба Вы боретесь за экономию одной команды вызова и одной команды возврата? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба Без комментариев. The Best :) Почему же без комментариев? их есть! ТХЕ БЕСТ оно будет когда все указанные функции объявим static. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба Без комментариев. The Best :) Почему же без комментариев? их есть! ТХЕ БЕСТ оно будет когда все указанные функции объявим static. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба Вы боретесь за экономию одной команды вызова и одной команды возврата? Я не борюсь, а интересуюсь. Мне уже очевидно, что сделать нельзя. ТХЕ БЕСТ оно будет когда все указанные функции объявим static. А вот здесь желательны комментарии. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба Почему же без комментариев? их есть! ТХЕ БЕСТ оно будет когда все указанные функции объявим static. Если их все объявить как static, то они на фиг никому будут не нужны, так как доступа к ним не будет. Можно (и идеологически правильно) Control() и Indication() объявить как static, чтобы к ним никто не совался кроме как через посредство Control_Indication(). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба Занятная статья. do{}while(0) я видел в чужих исходниках пару раз - и никак не мог понять зачем? Спасибо, разъяснили.. Трюк, конечно, хороший, только надо тоже с аккуратностью применять, ибо: 1) Хороший компилятор выдаст предупреждение о том, что условие никогда НЕ выполняется, хотя все сделает правильно, но лишние вопли придется давить локальными прагамами - некузяво :(. 2) Поганый компилятор (например, вот прямо сейчас работаю с рекордно поганым ImageCraft для M8C ) - такое НЕ соптимизирует - вообще гнусно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kosyak© 0 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба 2zltigo: Хм...логично. Тогда напрашивается вопрос - и как жить? :crying: Не использовать препроцессор прошу не предлагать :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба ТХЕ БЕСТ оно будет когда все указанные функции объявим static. Прокомментирую сам. Квалификатор static будет иметь смысл, если я эти функции заброшу в отдельный файл. Таких функций у меня несколько десятков, что ж, мне, столько файлов создавать? Не вижу смысла. P.S. Где-то здесь и зарыта собака "неполной структурированности" языка C. P.P.S. По поводу do {...} while (0) - а чем плохо показанное в той же статье строчкой выше {...} ? Разве кто-то заставляет писать I2C_CLOCK(); с точкой с запятой в конце? Или в дефайне можно было задать #define I2C_CLOCK(); {NOP(); SCL = 1; NOP(); SCL = 0;} Да, это не работает (кажется, в Hi-Tech PICC у меня получалось такое, а в Keil - нет) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба Или в дефайне можно было задать #define I2C_CLOCK(); {NOP(); SCL = 1; NOP(); SCL = 0;} Дык боролись за точку с запятой перед else - Где она? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба Хм...логично. Тогда напрашивается вопрос - и как жить? :crying: Думать по обстоятельствам. Не использовать препроцессор прошу не предлагать :) Почему? В числе решений по обстоятельствам, если компилятор не совсем дебильный, как вышеупомяутый, использовать принудительный inline. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kosyak© 0 3 декабря, 2010 Опубликовано 3 декабря, 2010 · Жалоба Понятн... Вот интересно - доживу я до момента когда в стандарт "С201x" включат шаблоны (template) на манер С++? И самое главное доживу ли я до появления компилятора, который будет это все поддерживать :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться