584________________________________Часть IV. Новые возможности C++

способа отличить ноль, полученный в результате вычислений, от кода ошибки не существует.

В качестве возвращаемых кодов ошибки часто используется специальное постоянное значение или диапазон значений. Если бы в предыдущем примере ноль был бы допустимым значением, вы, возможно, могли бы вместо него использовать -1. Однако и это далеко не всегда удается сделать.

У этого метода уведомления об ошибках имеется три недостатка. Во-первых, чтобы программа имела возможность контролировать ошибочные состояния, программист должен помнить, что означают коды ошибок. Этот подход весьма подвержен ошибкам (что означает код -1: "Переполнение памяти" или "Выход за границы диапазона", или этот код вообще зарезервирован коллегами из соседнего отдела?). Необходимость запоминать эти магические числа весьма эффективно способствует проникновению ошибок в ваши программы.

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

unsigned short Add(unsigned short addendl, unsigned short addend2);

Возможна ситуация, когда при сложении передаваемых функции чисел произойдет арифметическое переполнение значения возвращаемой величины типа unsigned short. Это, разумеется, ошибочная ситуация, и так об этом и следует сообщить. Но какое значение можно было бы вернуть в качестве ошибочного? Ноль нельзя, так как, когда оба слагаемых равны нулю, это совершенно правильный ответ. Фактически любое значение типа unsigned short в этом примере является допустимым. Просто нет ни одного свободного числа, которое можно было бы использовать в качестве кода ошибки. Однако, как вы увидите в следующем разделе, эта проблема преодолима.

Но вот насчет третьей проблемы этого сказать уже нельзя. Программа должна осуществлять контроль возвращаемого значения, чтобы вовремя установить, что произошла ошибка. Если программист ленив или просто забывает проверять возвращаемые значения, то серьезные ошибки могут проскользнуть незамеченными. Если вы думаете, что это маловероятно, спросите себя, когда вы сами в последний раз проверяли возвращаемое значение функций strcpyO ИЛИ printfO.

Таким образом, хотя возврат кода ошибки и является наиболее часто используемым методом контроля ошибок, с ним связан ряд серьезных недостатков.

Возврат значений ошибки через аргументы функций. Эта стратегия сообщения об ошибках является простым усовершенствованием предыдущей. Функции могут передавать сообщения об ошибках не через воз-