Коды ошибок в си
Вновь вернемся к нашему примеру функции регистрации пользователя из первой части. Но на этот раз она не будет возвращать код ошибки. Вместо этого она возбудит исключение, если что-то пойдет не так:
Следующий вопрос, который у вас мог возникнуть: «А как организовать передачу информации о контексте, в котором произошла ошибка»? Когда мы использовали простые коды ошибок, у нас для этого было предусмотрено перечисление. Каждый элемент перечисления соответствовал тому или иному типу ошибки. Этот вариант широко распространен и неплохо работает, но он имеет свои ограничения. Например, с помощью одного лишь кода ошибки у нас нет возможности передать дополнительную информацию, чтобы уточнить причину ошибки. В случае же с исключениями у вас появляется выбор. Рассмотрим несколько наиболее очевидных вариантов.
Вариант 1. Коды ошибок. Опять
// Не следует так делать…
if (timer. done)
// Одиночному оператору нужны скобки!
timer. control = TIMER_RESTART;
ПРАВИЛО #2 – Ключевое слово «const»
Ключевое слово const следует использовать:
— для объявления переменных, которые не должны меняться после инициализации,
— для определения передаваемых по ссылке параметров функции, которые не могут быть изменены,
— для определения полей в структурах и объединениях, которые не могут быть изменены
— в качестве альтернативы директиве #define при определении числовых констант.
const unsigned char dirPort = 0xff;
ПРАВИЛО #3 – Ключевое слово «static»
static void InnerFunction( void )
<
….
>
ПРАВИЛО #4 – Ключевое слово «volatile»
Ключевое слово volatile нужно использовать везде, где уместно, включая:
— Объявление глобальной переменной доступной любому обработчику прерываний,
— Объявление глобальной переменной доступной двум или более задачам,
— Объявление указателя к отображаемым в памяти периферийным регистрам ввода/вывода
volatile unsigned int timer;
ПРАВИЛО #5 – Комментарии
// Так делать нельзя.
/*
a = a + 1;
/* comment */
b = b + 1;
*/
// Так правильно.
#if 0
a = a + 1;
/* comment */
b = b + 1;
#endif
ПРАВИЛО #6 – Тип данных с фиксированной разрядностью
ПРАВИЛО #7 – Поразрядные операторы
, ^, <<, и >>) не должен использоваться для управления целочисленными данными со знаком.
ПРАВИЛО #8 – Целые числа со знаком и без
ПРАВИЛО #9 – Параметризированные макросы против inline функций
Не следует использовать параметризированный макрос, если для выполнения той же задачи может быть написана inline функция. <2>
ПРАВИЛО #10 – Оператор-запятая
Оператор запятая (,) не должен использоваться внутри описания переменной.
// Так делать нельзя…
char * x, y; // вы хотите, чтобы «y» был указателем, или нет?
СНОСКИ
Michael Barr «Bug-Killing Coding Standard Rules for Embedded C». Вольный перевод ChipEnable. Ru
Comments
*ушел переписывать все параметризирова нные макросы в инлайн функции*
давно взял себе за правило всегда объявлять все переменные с фиксированной разрядностью (uint8_t, etc.)
Кто знает что есть такая книга хорошо что есть такой сайт! Где можно узнать про книги и не только.
https://tech-geek. ru/error-handling-exceptions-in-c/
https://chipenable. ru/index. php/item/62