Программирование на языке C. Распространенные ошибки в функциях

Автор: soft-v3

Печать

Статьи - Программирование


Поделиться

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

No return (нет оператора return). Компилятор делает подобное предупреждение относительно любой возвращающей значение функции (т.е. отличной от типа void), не содержащей оператора return. Если подобная функция завершается без выполнения return, она возвращает непредсказуемое значение, которое может вызвать серьезные неприятности.

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

No prototype (нет прототипа). Считается, что функции, у которых нет прототипа, имеют тип int, даже если они определены как возвращающие значения другого типа. Не следует полагаться на это правило, лучше явно объявлять прототипы для всех функций.

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

Первые два типа перечисленных выше ошибок, отсутствие и обход оператора return, легко устраняются при внимательном отношении к предупреждениям компилятора. Следующая запись иллюстрирует самую распространенную ошибку:

int. AnylntFn (void)
{
if (условие) {
оператор1;
return 0;
} else
оператор2; /* ??? */
}

Эта функция выполняет оператор return, только если условие истинно. Если же условие ложно, оператор2 выполнится нормально, но функция завершится без выполнения оператора return.
Третья из представленного выше списка распространенных ошибок (отсутствие прототипа) восходит к старым С-программам. Функции без прототипов рассматриваются как имеющие тип int. Таким образом, вы могли бы без отрицательных последствий убрать прототипы, но делать это не рекомендуется.

Замечание. Функция main(), обычно записываемая без явного задания возвращаемого типа, однако она возвращает значение int. и, следовательно, ее можно объявить как int main(). Этим объясняется, почему функция main() должна выполнять оператор return, чтобы избежать предупреждения компилятора.

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


Похожие материалы:
Новые статьи:
Предыдущие статьи: