Ошибка при проверке функции, возвращающей int

Если у меня есть функция, которая возвращает какой-то указатель, я проверяю наличие ошибок, устанавливая для возврата значение NULL при ошибке.

char *foo(void) {
  //If stuff doesn't go okay
  return NULL;
}

char *bar = foo();
if(!bar) return 1;

Это отлично работает, потому что в таких случаях я знаю, что никогда не собираюсь возвращать NULL.

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

Пара обходных решений:

  1. Включите параметр кода ошибки в функцию
  2. Вернуть код ошибки и включить указатель int в качестве параметра

Проблема с обоими из них заключается в том, что у меня есть набор функций, которые делают одно и то же, но для разных типов, и я хочу поддерживать обычный интерфейс, чтобы их можно использовать таким же образом.

Есть ли другое решение, которое не предполагает изменения интерфейса функции? Каков наиболее распространенный способ справиться с этой ситуацией?

ВЫБРАННОЕ РЕШЕНИЕ

Спасибо за все ваши мысли и ответы по этому поводу.

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

Я выбрал этот корень, потому что обычно я обнаруживал, что при возврате более сложных форм данных количество потенциальных ошибок почти всегда было больше 1. Это означало, что использование NULL в качестве единственного источника В любом случае данные об ошибках были непрактичными, так как это означало, что невозможно было определить, в чем именно заключалась ошибка. С функциями, возвращающими данные как int, также стало невозможно отличить несколько разных кодов ошибок от действительных данных.

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

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

7
задан Rupert Madden-Abbott 31 March 2011 в 22:01
поделиться