Макрос для определение количества элементов в массиве
Существует интересный макрос, который используется для определения количества элементов в объявленном массиве. Его обычное определение выглядит так:
#define N_ELEMENTS(X) (sizeof(X)/sizeof(*(X)))
Данный макрос удобно применять для перебора всех элементов массива в циклах.
void foo(void)
{
uint8_t bar[] = {0, 1, 2, 3, 4};
uint8_t i;
/* передать каждый элемент массива bar[] */
for (i = 0; i < N_ELEMENTS(bar); ++i){
txc(bar[i]);
}
}
5 плохих правил программирования на Си
Майкл Барр
Недавно я наткнулся на пост в блоге одного разработчика, в котором он представил десять Си правил для лучшего программирования встраиваемых систем. На половину из этих правил у меня возникла жестко негативная реакция и я хочу описать, что мне так не понравилось. Далее по тексту я буду называть этого автора "Плохой Советчик". Я надеюсь, что если вы следовали пяти описанным ниже правилам, то мои комментарии убедят вас отойти от них. Если вы не согласны, начинайте конструктивное обсуждение в комментариях.
Как избежать типичных багов встроенного ПО. ч.2
Найэл Мерфи
В предыдущем разделе в своих ошибках мы подозревали поставщика компилятора, но он оказался не виноват. К сожалению, это не всегда так и, поскольку у разработчика обычно нет доступа к исходному коду компилятора, выявить ошибки компилятора очень трудно.
Много лет назад у нас был компилятор, который регулярно выдавал сообщения о синтаксических ошибках на неверных строках исходного кода. Это не было такой уж серьёзной неприятностью, поскольку поиск в обратном направлении от того места, где компилятор сообщал об ошибке, всегда позволял определить строку, где ошибка была допущена на самом деле. В некоторых случаях ошибка определялась на нужной строке; иногда погрешность составляла 10 строк или больше. По мере написания проекта и увеличения размера файлов, проблема, казалось, прогрессировала.