Значение по умолчанию для переменной errno

Я хочу использовать библиотеку errno, чтобы определить возврат функций проекта (языка c). И я кое о чем думаю...

Я сделаю что-то вроде этого:

#include <errno.h>

int myfunction (void)
{
  int res;

  /*Some actions....*/

  if(success)
    res = 0;
  else if (fail)
    res = -EIO;

  return res;
 }

Мне нравится всегда инициализировать мою локальную переменную, и мне интересно, каким должно быть значение по умолчанию для переменной, использующей значение errno (вероятно, 0)? Но мне не очень нравится устанавливать по умолчанию: «УСПЕХ», я предпочитаю значение «Отказ». Какова ваша точка зрения (или правило) по этому поводу?

Спасибо заранее.


person Joze    schedule 09.01.2014    source источник
comment
Какое отношение к этому имеет errno? IIRC, вы всегда должны устанавливать errno = 0 перед вызовом библиотечной функции, потому что не гарантируется, что библиотечная функция установит для нее значение 0 в случае успеха.   -  person Kevin    schedule 09.01.2014
comment
Errno является свойством ядра и стандартной библиотеки. Определите свою собственную глобальную переменную, если вы настаиваете на повторении этой ошибки, иначе просто определите возвращаемые значения.   -  person bmargulies    schedule 09.01.2014
comment
Если вопрос заключается в том, что я должен поставить после int res = в начале функции, я полагаю, что это может сводиться к тому, как вы на самом деле проверяете успех/неудачу. Предположительно, у вас на самом деле нет провала, как вы показываете в своем примере кода, где, возможно, ни успех, ни неудача не верны....   -  person tabstop    schedule 09.01.2014
comment
Вы не должны указывать значение для res - как будто вы удаляете предупреждение компилятора, которое в противном случае сообщит вам, если у вас случайно есть путь через вашу функцию, которая не инициализирует ее.   -  person Tim B    schedule 10.01.2014


Ответы (2)


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

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

person Jens Gustedt    schedule 09.01.2014

Не существует значения EGENERIC/EUNKNOWN, определенного как какой-то общий индикатор ошибки.

У вас есть следующие варианты:

  • Будьте оптимистичны и установите результат по умолчанию на 0, указывающий на успех.
  • Используйте значение по умолчанию для конкретной функции из набора значений, определенных для errno.
  • Если для errno возвращаются отрицательные значения, используйте 1 в качестве общего значения ошибки.
  • Используйте положительное значение errno и используйте -1 в качестве общего индикатора ошибки.

Для последних опций также установите errno внутри вашей функции.


Обновление в системах POSIX

Если вы собираетесь использовать значение, определенное для errno, нет переносимого способа использовать любое другое значение, кроме 0, как POSIX явно указывает:

В программах должны использоваться только имена макросов *1, поскольку фактическое значение номера ошибки не указано.

*1 Это относится к Exyz макросам, как указано здесь.< /а>

person alk    schedule 09.01.2014