Информатика и технология программирования


Области действия функций - часть 2


В "классическом" Си имеет место одно очень важное умолчание. Если производится вызов функции, ранее не определенной и не объявленной, то транслятор по умолчанию считает ее внешней с типом результата int , автоматически добавляя объявление вида:


extern int f();

Такое умолчание приводит к нескольким достаточно распространенным ошибкам:



-если программист по ошибке указывает вызов функции с неправильным именем, то при трансляции ошибка, как правило, не возникает, но при этом компоновщик не находит данное имя в собственных библиотеках. Ошибка, таким образом, переносится на этап компоновки. Например, pintf("%d %d\n",a,b) приводит к успешной трансляции, но к ошибочной компоновке программы в связи с отсутствием функции pintf ;



-если вызов функции в модуле выполняется до ее определения, то по умолчанию она также объявляется в точке ее вызова. Это может привести к конфликту типов результата в месте ее последующего определения. Особенно это касается "любителей" располагать функцию main в начале модуля:


void main()
{ // по умолчанию объявляются как


f(); // extern int f();


g(); // extern int g();


}
void f() // конфликт типов результата


{ // int и void в объявлении


} // и определении функции



Такую ошибку можно исключить предварительным объявлением функции в любом месте перед ее вызовом:




void f();



-если используется библиотечная функция, которая возвращает не целый результат, то отсутствие ее объявления приводит к тому, что возникает расхождение между ожидаемым транслятором по умолчанию типом int и реально возвращаемым типом (например, char* или double ). Если эти результаты имеют одну размерность, то, как правило, ошибки не происходит. В противном случае возвращаемое значение "усекается" или "расширяется" до int и становится неопределенным. В приведенном ниже примере результат типа double "усекается" (но не преобразуется) до int , а затем опять переводится в тип double . Ошибка связана с отсутствием объявления функции sin:




Начало  Назад  Вперед