|
Программирование >> Перегруженные имена функций и идентификаторы
аргументов, посылаемых функции. Список выражений может быть пустым. При выполнении вызова функции происходит замена формальных аргументов на фактические. Перед заменой каждый из фактических аргументов вычисляется. Первый фактический аргумент соответствует первому формальному аргументу, второй - второму и т.д. Вызванная функция работает с копией действительных аргументов, поэтому любое изменение, сделанное функцией с аргументами, не отразится на оригинальных величинах, с которых была сделана копия. Передача управления осуществляется на первый оператор функции. Выполнение оператора return в теле функции возвращает управление и, возможно, значение возврата в вызывающую функцию. Если оператор return не выполнен, то управление возвращается после выполнения последнего оператора тела функции. При этом величина возврата не определена. Важно: Выражения в списке аргументов вызова функции могут выполняться в любом порядке, так что выражения с побочными эффектами могут дать непредсказуемые результаты. Компилятор только гарантирует, что все побочные эффекты будут вычислены перед передачей управления в вызываемую функцию. Выражение перед скобками должно быть преобразовано к адресу функции. Это означает, что функция может быть вызвана через любое выражение типа указателя на функцию. Это позволяет вызывать функцию в той же самой манере, что и объявлять. Это необходимо при вызове функции через указатель. Например, предположим, что указатель на функцию объявлен как следующий: int (* fpointer)(int,int); Идентификатор fpointer указывает на функцию с двумя аргументами типа int и возвращающую значение типа int. Вызов функции в этом случае будет выглядеть следующим образом: (* fpointer)(3,4); Здесь используется операция разадресации (*), чтобы получить адрес функции, на которую ссылается указатель fpointer. Адрес функции затем используется дя ее вызова. Фактические аргументы Фактические аргументы могут быть любой величиной основного, структурного, совмещающего или адресного типов. Хотя массивы и функции не могут быть переданы как параметры, но указатели на эти объекты могут передаваться. Все фактические аргументы передаются по значению. Копия фактических аргументов присваивается соответствующим формальным параметрам. Функция использует эти копии, не влияя на переменные, с которых копия была сделана. Путь доступа из функции к значениям оригинальных переменнгх обеспечивают указатели. Т.к. указатель на переменную содержит адрес переменной, то функция может использовать этот адрес для доступа к значению переменной. Аргументы-указатели обеспечивают доступ из функции к массивам и функциям, которые запрещено передавать как аргументы. Тип каждого формального параметра также подвергается обычным арифметическим преобразованиям. Преобразованный тип каждого формального параметра определяет, каким образом интерпретируются аргументы в стеке. Если тип формального параметра не соответствует типу фактического параметра, то данные в стеке могут быть проинтерпретированы неверно. Важно: Несоответствие типов формальных и фактических параметров может произвести серию ошибок, особенно когда несоответствие влечет за собой отличия в размерах. Нужно иметь в виду, что эти ошибки не выявляются, если не задан список типов аргументов в forward-объявлении функции. Вызовы с переменным числом аргументов Чтобы вызвать функцию с переменным числом аргументов, в вызове функции просто задается любое число аргументов. В forward-объявлении (если оно есть) переменное число аргументов специфицируется записью запятой с последующим многоточием (,...) в конце списка типов аргументов. Каждому имени типа, специфицированному в списке типов аргументов, соответствует один фактический аргумент в вызове функции. Если задано только многоточие (без имен типов), то это значит, что нет аргументов, которые обязательно требуются при вызове функции. Аналогично, список аргументов в определении функции может также заканчиваться запятой с последующим многоточием (,...), что подразумевает переменное число аргументов. Если список аргументов содержит только многоточие (...), то число аргументов переменно или равно нулю. Важно: Для поддержки совместимости с предыдущими версиями компилятор воспринимает для обозначения переменного числа аргументов символ запятой без последующего многоточия в конце списка типов аргументов или списка параметров. Так же может быть использована отдельная запятая вместо многоточия для объявления и определения функций, требующих нуль или более аргументов. Использование запятой поддерживается только для совместимости. Желательно использовать в новой версии многоточие. Все аргументы, заданные в версии функции, размещаются в стеке. Количество формальных параметров, объявленных для функции, определяет число аргументов, которые берутся из стека и присваиваются формальным параметрам. Программист отвечает за выбор лишних аргументов из стека и за то, сколько аргументов находится в стеке. Смотрите в системной документации информацию о макросах, которые могут быть использованы для управления переменным числом аргументов. Рекурсивные вызовы Любая функция в Си-программе может быть вызвана рекурсивно. Для этого функция вызывает саму себя. Компилятор Си допускает любое число рекурсивных вызовов функции. При каждом вызове формальных параметров и переменных класса памяти auto и register захватывается новая память, так что их значения из предшествующих незавершенных вызовов не перезаписываются. Предшествующие параметры недоступны в других версиях функции, исключая версию, в которой они были созданы. Заметим, что переменные, объявленные как глобальные, не требуют новой памяти при каждом рекурсивном вызове. Их память сохраняется на все время жизни программы.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |