Программирование. Принципы и практика использования C++ Исправленное издание, стр. 62
int area(int x, int y, char unit) { /* ... */ } // не "наша" area()Обратите внимание на то, что имя функции, набранное с ошибкой, обычно не порождает ошибки на этапе редактирования связей. Но как только компилятор обнаружит необъявленную функцию, он немедленно выдаст сообщение об ошибке. Это хорошо: ошибки на этапе компиляции обнаруживаются раньше ошибок на этапе редактирования связей и, как правило, легче устраняются.
Как указывалось выше, правила связывания функций распространяются и на все другие сущности программы, например, на переменные и типы: каждая сущность с заданным именем должна быть определена только один раз, но объявлять ее можно сколько угодно, причем все эти объявления должны быть точно согласованными по типам. Детали изложены в разделах 8.2 и 8.3.
5.5. Ошибки во время выполнения программы
Если программа не содержит ошибок, которые можно обнаружить на этапах компиляции и редактирования связей, то она выполняется. Здесь-то и начинаются настоящие приключения. При написании программы можно выявить и устранить ошибки, но исправить ошибку, обнаруженную на этапе выполнения программы, не так легко. Рассмотрим пример.
int area(int length, int width) // Вычисляем площадь прямоугольника{ return length*width;}int framed_area(int x, int y) // Вычисляем площадь, // ограниченную рамкой{ return area(x–2,y–2);}int main(){ int x = –1; int y = 2; int z = 4; // ... int area1 = area(x,y); int area2 = framed_area(1,z); int area3 = framed_area(y,z); double ratio = double(area1)/area3; // Преобразуем к типу double, // чтобы выполнить деление // с плавающей точкой}Для того чтобы сделать проблемы менее очевидными и усложнить задачу компилятора, в качестве аргументов мы решили использовать переменные
xyzarea1area2area()Прежде чем пытаться ответить на эти вопросы, проанализируем вычисление переменной
ratioarea30double(area1)/area3Итак, попробуем разобраться с ошибкой, связанной с вызовом функции
area()1. Следует исправить ошибку в модуле, вызывающем функцию
area()2. Позволить функции
area()5.5.1. Обработка ошибок в вызывающем модуле
Сначала рассмотрим первую альтернативу (“Берегись, пользователь!”). Именно ее нам следовало бы принять, например, если бы функция
area()Предотвратить ошибку при вызове функции
area(x,y)main()if (x<=0) error("неположительное x");if (y<=0) error("неположительное y");int area1 = area(x,y);Действительно, остается только решить, что делать, обнаружив ошибку. Здесь мы решили вызвать функцию
error()std_lib_facilities.herror()error()runtime_errorЕсли не хотите получать сообщения об ошибках в каждом из аргументов, то код можно упростить.
if (x<=0 || y<=0) error("неположительный аргумент функции area()");// || значит ИЛИint area1 = area(x,y);Для того чтобы полностью защитить функцию
area()framed_area()if (z<=2)