Использование errno для отчетов об ошибках приложений и библиотек

Я пишу библиотеку C для программного проекта. Мне нужно сделать некоторые сообщения об ошибках, но я немного ленив, чтобы реализовать собственный сложный набор кодов ошибок, переменных и функций. Допустимо ли использовать средство errno, предоставленное libc для пользовательских отчетов об ошибках? Все мои ошибки вписываются в категории, заданные макросами E....

Например, пусть мой код включает функцию, которая читает хэш SHA256 в шестнадцатеричной нотации и преобразует ее в какой-то внутренний формат. Я хочу использовать errno для сообщения об ошибках:

#include <errno.h>

int hash_fromstr(hash_t *out, const char *in) {
  /* ... */

  if (strlen(in) != 65) {
    errno = EINVAL;
    return -1;
  }

  /* ... */
}

Конечно, этот пример смехотворно упрощен, в действительности в других функциях может произойти гораздо больше ошибок.

Ответ 1

Многие люди считают это безвкусным. Прежде всего, шаблон состоит в том, чтобы создать свою собственную переменную с рядом конкретных значений, которые настроены на вашу проблему. Во-вторых, есть вопрос о безопасности потоков, который обрабатывается для errno через обман.

Вы уверены, что не хотите добавлять дополнительную int* к каждой функции для получения значения статуса?

Ответ 2

Вы можете изменить значение errno по своему усмотрению, просто убедитесь, что ваш код библиотеки проверяет, что errno не задан, прежде чем делать это, чтобы ваш код библиотеки все еще мог правильно обнаруживать ошибки внутреннего стандарта, которые вызывают определение errno. Вы также можете проверить "я должен установить errno" для получения дополнительной информации.

Ответ 3

Да, вы можете изменить его, и у него есть область потока, что очень желательно в такой обработке ошибок.

Использование семейства ошибок errno (E...) и, возможно, его расширение может быть очень мощным, но простым шаблоном обработки ошибок. Это может считаться неудачным подходом других, но IMHO создает чистый код и стандартизованный шаблон для обработки ошибок.