Если у меня есть функция, которая возвращает какой-то указатель, я проверяю наличие ошибок, устанавливая для возврата значение NULL при ошибке.
char *foo(void) {
//If stuff doesn't go okay
return NULL;
}
char *bar = foo();
if(!bar) return 1;
Это отлично работает, потому что в таких случаях я знаю, что никогда не собираюсь возвращать NULL.
Однако иногда у меня будут функции, возвращающие целые числа (в этом случае я читаю целые числа из файла конфигурации). Однако проблема в том, что теперь нет возможности проверить возвращаемое значение на наличие ошибок, потому что любое значение (включая 0) может быть подлинным.
Пара обходных решений:
Проблема с обоими из них заключается в том, что у меня есть набор функций, которые делают одно и то же, но для разных типов, и я хочу поддерживать обычный интерфейс, чтобы их можно использовать таким же образом.
Есть ли другое решение, которое не предполагает изменения интерфейса функции? Каков наиболее распространенный способ справиться с этой ситуацией?
ВЫБРАННОЕ РЕШЕНИЕ
Спасибо за все ваши мысли и ответы по этому поводу.
В конце концов я решил, что если функция предназначена для возврата некоторых данных, ошибка может быть возвращена только с помощью параметра ошибки. В противном случае ошибка возвращается напрямую.
Я выбрал этот корень, потому что обычно я обнаруживал, что при возврате более сложных форм данных количество потенциальных ошибок почти всегда было больше 1. Это означало, что использование NULL в качестве единственного источника В любом случае данные об ошибках были непрактичными, так как это означало, что невозможно было определить, в чем именно заключалась ошибка. С функциями, возвращающими данные как int, также стало невозможно отличить несколько разных кодов ошибок от действительных данных.
То же самое, конечно, неверно для функций, которые на самом деле не возвращают никаких данных, и в этом случае я могу использовать возвращаемое значение как ошибку код.
Мне также нравится тот факт, что в приведенном выше шаблоне проводится четкое различие между функциями, которые возвращают данные, и функциями, которые этого не делают.