Что называется прототипом функции

Прототип функции

Прототипом функции в языке Си или C++ называется объявление функции, которое не содержит тело функции, но указывает имя функции, арность, типы аргументов и возвращаемый тип данных. В то время как определение функции описывает, что именно делает функция, прототип функции может восприниматься как описание её интерфейса.

В прототипе имена аргументов являются необязательными, тем не менее, необходимо указывать тип вместе со всеми модификаторами (например, указатель ли это или константный аргумент).

Содержание

Пример

В качестве примера, рассмотрим следующий прототип функции:

Этот прототип объявляет функцию с именем «foo», которая принимает один аргумент «n» целого типа и возвращает целое число. Определение функции может располагаться где угодно в программе, но определение требуется только в случае её использования.

Использование

Уведомление компилятора

Если функция предварительно не была объявлена, а её имя встречается в выражении, следующим за открывающей скобкой, то она неявно объявляется как функция, возвращающая результат типа int и ничего не предполагается о её аргументах. В этом случае компилятор не сможет выполнить проверку типов аргументов и арность, когда функция вызывается с некоторыми аргументами. Это потенциальный источник проблем. Следующий код иллюстрирует ситуацию, в которой поведение неявно объявленной функции не определено.

Функция «foo» ожидает аргумент целого типа, находящийся в стеке при вызове. Если прототип пропущен, компилятор не может это обработать и «foo» завершит операцию на некоторых других данных стека (вероятно, это будет обратный адрес или значение переменной, не входящей в область допустимых значений). Включением прототипа функции вы информируете компилятор о том, что функция «foo» принимает один аргумент целого типа и вы тем самым позволяете компилятору обрабатывать подобные виды ошибок.

Создание библиотечных интерфейсов

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

Объявления класса

В C++ прототипы функций также используются в определении классов.

Ссылки

См. также

Полезное

Смотреть что такое «Прототип функции» в других словарях:

Прототип — (от др. греч. πρῶτος первый и τύπος отпечаток, оттиск; прообраз, образец), Prototype: Прототип (когнитивная психология) абстрактный образ, воплощающий множество сходных форм одного и того же объекта или паттерна, наиболее… … Википедия

прототип — ПРОТОТИП (от греч. prototypon прообраз) в когнитивистике лучший представитель («лучший пример») когнитивной или языковой категории. Теория прототипов разрабатывалась параллельно в когнитивной психологии (Л.С. Выготский, Э. Рош),… … Энциклопедия эпистемологии и философии науки

WinMain — функция, в которой программист пишет основной код, который будет выполнять программа под Windows для подсистемы GUI. Эта функция вызывается из функции WinMainCRTStartup (находящейся в CRT), которая по умолчанию является точкой входа в программу… … Википедия

Объявление (информатика) — Возможно, эта статья содержит оригинальное исследование. Добавьте ссылки на источники, в противном случае она может быть выставлена на удаление. Дополнительные сведения могут быть на странице обсуждения. (25 мая 2011) … Википедия

Strcpy — функция стандартной библиотеки языка программирования Си, для копирования нуль терминированной строки в заданный буфер. Содержание 1 Прототип функции 2 Возвращаемое значение … Википедия

Экспериментальная модель — Прототип (от греч. protos первый и typos отпечаток, оттиск) прообраз, образец, оригинал. Прототип м. греч. первообраз, начальный, основной образец, истинник. Прототипный, типический, первообразный, первообразцовый (Словарь Даля). Прототип в… … Википедия

D (язык программирования) — У этого термина существуют и другие значения, см. D. D Семантика: мультипарадигменный: императивное, объектно ориентированное, обобщённое программирование Тип исполнения: компилятор Появился в: 1999 Автор(ы) … Википедия

Feof — feof функция стандартной библиотеки языка Си, объявленная в заголовочном файле stdio.h. Ее основное назначение отличать случаи, когда операции потока достигают конца файла, от случаев, когда возвращается код ошибки EOF («конец файла» … Википедия

DLL — (англ. Dynamic link library динамически подключаемая библиотека) понятие операционных систем Microsoft Windows и IBM OS/2; динамическая библиотека, позволяющая многократное применение различными программными приложениями. K DLL… … Википедия

Источник

Урок №19. Прототип функции и Предварительное объявление

Обновл. 11 Сен 2021 |

На этом уроке мы рассмотрим прототип функции и предварительное объявление в языке С++.

Наличие проблемы

Посмотрите на этот, казалось бы, невинный кусочек кода под названием add.cpp:

Вы, наверное, ожидаете увидеть примерно следующий результат:

The sum of 3 and 4 is: 7

Но в действительности эта программа даже не скомпилируется. Причиной этому является то, что компилятор читает код последовательно. Когда он встречает вызов функции add() в строке №5 функции main(), он даже не знает, что такое add(), так как это еще не определили! В результате чего мы получим следующую ошибку:

add: идентификатор не найден

Чтобы устранить эту проблему, мы должны учитывать тот факт, что компилятор не знает, что такое add(). Есть 2 решения.

Решение №1: Поместить определение функции add() выше её вызова (т.е. перед функцией main()):

Таким образом, при вызове функции add() в функции main(), компилятор будет знать, что это такое. Так как это простая программа, то внести подобные изменения несложно. Однако в программах, содержащих большое количество строк кода, это может быть утомительно — узнавать кто кого вызывает и в каком порядке (чтобы соблюсти правильную последовательность).

Прототипы функций и Предварительное объявление

Решение №2: Использовать предварительное объявление.

Предварительное объявление сообщает компилятору о существовании идентификатора ДО его фактического определения.

В случае функций, мы можем сообщить компилятору о существовании функции до её фактического определения. Для этого нам следует использовать прототип этой функции. Прототип функции (полноценный) состоит из типа возврата функции, её имени и параметров (тип + имя параметра). В кратком прототипе отсутствуют имена параметров функции. Основная часть (между фигурными скобками) опускается. А поскольку прототип функции является стейтментом, то он также заканчивается точкой с запятой.

Источник

Определения, описания и вызовы функций

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

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

Функции бывают двух видов: математические функции(функции из стандартной библиотеки) и функции, определенные пользователем.

Математические библиотечные функции

sqrt(x) – корень квадратный;

pow(x,y) – возведение х в степень у;

fabs(x) абсолютное значение целого числа,

dabs(x) вещественного, длинного числа

exp(x) – экспоненциальная функция е х ;

log(x) – натуральный логарифм;

log10(x) – десятичный логарифм;

sin(x), cos(x), tan(x) – тригонометрические функции.

Функции, определенные пользователем

Функция – это независимая совокупность объявлений и операторов, обычно предназначенная для выполнения определенной задачи.

При программировании на С++ функция – это основное понятие, без которого невозможно обойтись.

Во-первых, каждая программа имеет главную функцию (единственную) с именем main(). Именно функция main() обеспечивает создание точки входа в откомпилированную программу.

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

Принципы модульного программирования.

Определение функции

Синтаксис:

тип_функции имя_функции (список формальных параметров)

тело функции;

Правила объявления функции

Список всегда ограничен круглыми скобками даже в случае, когда он пуст (main(); randomize() и т.д.)

Список формальных параметров имеет следующий синтаксис:

(тип_перем_1 перем_1, тип_перем_2 перем_2)

Например: float fun (int a, int b, float d)

Ошибка, если при объявлении формальных переменных не указывается тип для каждой переменной (int a, b) – нельзя!

Составной оператор – содержит операторы, которые определяют действие функции.

Блок – содержит объявление локальных переменных и операторы.

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

Примеры:

1) int maxi (int x, int y)

if (x>y) max = x;

else max = y;
return max;

2) double cub( float y)

Если функция имеет тип void, то функция не возвращает никакого значения
в качестве своего результата. Например, функция обмена значениями двух
переменных void swap (inta, int b)

6.Вызов функции. Обращение к функции – это и есть вызов функции, которое записывается через выражение: имя_функции (список фактических параметров)

При обращении к функции (вызове функции) формальные параметры заменяются фактическими, при этом должны соблюдаться правила соответствия по последовательности, по типам и количеству.

Фактический параметр – это выражение того же типа, что и соответствующего ему формального параметра.

Объявление функции (прототип функции)

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

Синтаксис:

тип_функции_имя_функции (список форм параметров);

main()

тело главной функции

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

тип_функции_имя_функции (список форм параметров)

тело функции

Отличие описания функции от определения

Пример функции, определенной пользователем (Решение задачи можно посмотреть, скачав файл «Задача-10»):

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

main()
int z,z1,c,q;
cout >z1;
z=summa(z1);
cin>>q;
c=summa(q);
if (z>c) cout z) cout

Источник

Прототип функции

В общем виде прототип функции должен выглядеть таким образом:

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

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

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

Имеется небольшая, но важная разница в том, как именно в С и C++ обрабатывается прототип функции, не имеющей параметров. В C++ пустой список параметров указывается полным отсутствием в прототипе любых параметров. Например,

Таким образом компилятор узнает, что у функции нет параметров, и любое обращение к ней, в котором имеются аргументы, будет считаться ошибкой. В C++ использование ключевого слова void внутри пустого списка параметров также разрешено, но считается излишним.

Прототипы функций позволяют «отлавливать» ошибки еще до запуска программы. Кроме того, они запрещают вызов функций при несовпадении типов (т.е. с неподходящими аргументами) и тем самым помогают проверять правильность программы.

И напоследок хотелось бы сказать следующее: так как в ранних версиях С синтаксис прототипов в полном объеме не поддерживался, то в С прототипы формально не обязательны. Такой подход необходим для совместимости с С-кодом, созданным еще до появления прототипов. Но если старый С-код переносится в C++, то перед компиляцией этого кода в него необходимо добавить полные прототипы функций. Помните, что хотя прототипы в С не обязательны, но они обязательны в C++. Это значит, что каждая функция в программе на языке C++ должна иметь полный прототип. Поэтому при написании программ на С в них указываются полные прототипы функций — именно так поступает большинство программистов, работающих на этом языке.

Старомодные объявления функций

В «ранней молодости» языка С, еще до создания прототипов функций, все-таки была необходимость сообщить компилятору о типе результата функции, чтобы при вызове функции был создан правильный код. (Так как размеры разных типов данных разные, то размер типа результата надо было знать еще до вызова функции.) Это выполнялось с помощью объявления функции, не содержащего никакой информации о параметрах. С точки зрения теперешних стандартов этот старомодный подход является архаичным. Однако его до сих пор можно найти в старых кодах. По этой причине важно понимать, как он работает.

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

Общий вид старомодного оператора объявления функции такой:

Обратите внимание, что список параметров пустой. Даже если функция принимает аргументы, то ни один из них не перечисляется в объявлении типа.

Как уже говорилось, старомодное объявление функции устарело и не должно использоваться в новом коде. Кроме того, оно несовместимо с C++.

Что такое прототип функции

В качестве примера, рассмотрим следующий прототип функции:

Этот прототип объявляет функцию с именем «foo», которая принимает один аргумент «n» целого типа и возвращает целое число. Определение функции может располагаться где угодно в программе, но определение требуется только в случае её использования.

Использование

Уведомление компилятора

Если функция предварительно не была объявлена, а её имя встречается в выражении, следующим за открывающей скобкой, то она неявно объявляется как функция, возвращающая результат типа int и ничего не предполагается о её аргументах. В этом случае компилятор не сможет выполнить проверку типов аргументов и арность, когда функция вызывается с некоторыми аргументами. Это потенциальный источник проблем. Следующий код иллюстрирует ситуацию, в которой поведение неявно объявленной функции не определено.

Функция «foo» ожидает аргумент целого типа, находящийся в стеке при вызове. Если прототип пропущен, компилятор не может это обработать и «foo» завершит операцию на некоторых других данных стека (вероятно, это будет обратный адрес или значение переменной, не входящей в область допустимых значений). Включением прототипа функции вы информируете компилятор о том, что функция «foo» принимает один аргумент целого типа и вы тем самым позволяете компилятору обрабатывать подобные виды ошибок.

Создание библиотечных интерфейсов

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

Объявления класса

В C++ прототипы функций также используются в определении классов.

Ссылки

См. также

Смотреть что такое «Прототип функции» в других словарях:

Прототип — (от др. греч. πρῶτος первый и τύπος отпечаток, оттиск; прообраз, образец), Prototype: Прототип (когнитивная психология) абстрактный образ, воплощающий множество сходных форм одного и того же объекта или паттерна, наиболее… … Википедия

прототип — ПРОТОТИП (от греч. prototypon прообраз) в когнитивистике лучший представитель («лучший пример») когнитивной или языковой категории. Теория прототипов разрабатывалась параллельно в когнитивной психологии (Л.С. Выготский, Э. Рош),… … Энциклопедия эпистемологии и философии науки

WinMain — функция, в которой программист пишет основной код, который будет выполнять программа под Windows для подсистемы GUI. Эта функция вызывается из функции WinMainCRTStartup (находящейся в CRT), которая по умолчанию является точкой входа в программу… … Википедия

Объявление (информатика) — Возможно, эта статья содержит оригинальное исследование. Добавьте ссылки на источники, в противном случае она может быть выставлена на удаление. Дополнительные сведения могут быть на странице обсуждения. (25 мая 2011) … Википедия

Strcpy — функция стандартной библиотеки языка программирования Си, для копирования нуль терминированной строки в заданный буфер. Содержание 1 Прототип функции 2 Возвращаемое значение … Википедия

Экспериментальная модель — Прототип (от греч. protos первый и typos отпечаток, оттиск) прообраз, образец, оригинал. Прототип м. греч. первообраз, начальный, основной образец, истинник. Прототипный, типический, первообразный, первообразцовый (Словарь Даля). Прототип в… … Википедия

D (язык программирования) — У этого термина существуют и другие значения, см. D. D Семантика: мультипарадигменный: императивное, объектно ориентированное, обобщённое программирование Тип исполнения: компилятор Появился в: 1999 Автор(ы) … Википедия

Feof — feof функция стандартной библиотеки языка Си, объявленная в заголовочном файле stdio.h. Ее основное назначение отличать случаи, когда операции потока достигают конца файла, от случаев, когда возвращается код ошибки EOF («конец файла» … Википедия

DLL — (англ. Dynamic link library динамически подключаемая библиотека) понятие операционных систем Microsoft Windows и IBM OS/2; динамическая библиотека, позволяющая многократное применение различными программными приложениями. K DLL… … Википедия

Прототипы функций Function Prototypes

Объявление функции предшествует ее определению и указывает имя, тип возвращаемого значения, класс хранения и другие атрибуты функции. A function declaration precedes the function definition and specifies the name, return type, storage class, and other attributes of a function. Чтобы объявление функции стало ее прототипом, оно должно также задавать типы и идентификаторы аргументов функции. To be a prototype, the function declaration must also establish types and identifiers for the function’s arguments.

Синтаксис Syntax

declaration: declaration:
declaration-specifiers attribute-seqopt init-declarator-listopt ; declaration-specifiers attribute-seqopt init-declarator-listopt ;

/* attribute-seqopt поддерживается только компилятором Майкрософт */ /* attribute-seqopt is Microsoft-specific */

declaration-specifiers: declaration-specifiers:
storage-class-specifier declaration-specifiersopt storage-class-specifier declaration-specifiersopt
type-specifier declaration-specifiersopt type-specifier declaration-specifiersopt
type-qualifier declaration-specifiersopt type-qualifier declaration-specifiersopt

init-declarator-list: init-declarator-list:
init-declarator init-declarator
init-declarator-list , init-declarator init-declarator-list , init-declarator

init-declarator: init-declarator:
declarator declarator
declarator = initializer declarator = initializer

direct-declarator: /* Декларатор функции */ direct-declarator: /* A function declarator */
direct-declarator ( parameter-type-list ) /* Декларатор нового стиля */ direct-declarator ( parameter-type-list ) /* New-style declarator */
direct-declarator ( identifier-listopt ) /* Декларатор устаревшего стиля */ direct-declarator ( identifier-listopt ) /* Obsolete-style declarator */

Прототип имеет ту же форму, что и определение функции, но завершается точкой с запятой сразу после закрывающей круглой скобки и поэтому не имеет тела. The prototype has the same form as the function definition, except that it is terminated by a semicolon immediately following the closing parenthesis and therefore has no body. В любом случае возвращаемый тип должен соответствовать возвращаемому типу, указанному в определении функции. In either case, the return type must agree with the return type specified in the function definition.

Ниже перечислены важные случаи применения прототипов функций: Function prototypes have the following important uses:

Они указывают тип возвращаемого значения для функций, которые возвращают значения с типом, отличным от int. Хотя для функций, которые возвращают значения с типом int, прототипы не обязательны, рекомендуется их использовать. They establish the return type for functions that return types other than int. Although functions that return int values do not require prototypes, prototypes are recommended.

Без полных прототипов выполняются стандартные преобразования, но не производится попытка сравнения типа или количества аргументов с количеством параметров. Without complete prototypes, standard conversions are made, but no attempt is made to check the type or number of arguments with the number of parameters.

Прототипы используются для инициализации указателей на функции до определения этих функций. Prototypes are used to initialize pointers to functions before those functions are defined.

Список параметров используется для проверки соответствия аргументов в вызове функции и параметров в ее определении. The parameter list is used for checking the correspondence of arguments in the function call with the parameters in the function definition.

Преобразованный тип каждого параметра определяет интерпретацию аргументов, помещаемых в стек при вызове функции. The converted type of each parameter determines the interpretation of the arguments that the function call places on the stack. Несоответствие типов аргументов и параметров может приводить к неправильной интерпретации аргументов в стеке. A type mismatch between an argument and a parameter may cause the arguments on the stack to be misinterpreted. Например, если на 16-разрядном компьютере в качестве аргумента передается 16-разрядный указатель, объявленный как параметр long, первые 32 бита в стеке интерпретируются как параметр long. For example, on a 16-bit computer, if a 16-bit pointer is passed as an argument, then declared as a long parameter, the first 32 bits on the stack are interpreted as a long parameter. Такая ошибка создает проблемы не только с параметром long, но и со всеми последующими параметрами. This error creates problems not only with the long parameter, but with any parameters that follow it. Ошибки такого типа можно обнаруживать, объявляя полные прототипы для всех функций. You can detect errors of this kind by declaring complete function prototypes for all functions.

Прототип задает атрибуты функции, поэтому вызовы функции, предшествующие ее определению (или производимые из других файлов исходного кода), можно проверять на соответствие типов аргументов и возвращаемого типа. A prototype establishes the attributes of a function so that calls to the function that precede its definition (or occur in other source files) can be checked for argument-type and return-type mismatches. Например, если в прототипе указан описатель класса хранения static, необходимо также задать класс хранения static в определении функции. For example, if you specify the static storage-class specifier in a prototype, you must also specify the static storage class in the function definition.

Полные объявления параметров ( int a ) могут использоваться совместно с абстрактными деклараторами ( int ) в одном объявлении. Complete parameter declarations ( int a ) can be mixed with abstract declarators ( int ) in the same declaration. Например, следующее объявление является допустимым: For example, the following declaration is legal:

Прототип может содержать как тип, так и идентификатор для каждого выражения, которая передается в качестве аргумента. The prototype can include both the type of, and an identifier for, each expression that is passed as an argument. Однако область действия такие идентификатор распространяется только до конца объявления. However, such identifiers have scope only until the end of the declaration. Прототип также может отражать тот факт, что число аргументов является переменным, или что никакие аргументы не передаются. The prototype can also reflect the fact that the number of arguments is variable, or that no arguments are passed. Без такого списка выявление несоответствий невозможно, поэтому компилятор не может создавать соответствующие диагностические сообщения. Without such a list, mismatches may not be revealed, so the compiler cannot generate diagnostic messages concerning them. Дополнительные сведения о проверке типов содержатся в статье Аргументы. See Arguments for more information on type checking.

Теперь область видимости прототипа в компиляторе Microsoft C соответствует стандарту ANSI при компиляции с параметром /Za. Prototype scope in the Microsoft C compiler is now ANSI-compliant when compiling with the /Za compiler option. Таким образом, если вы объявите в прототипе тег struct или union, этот тег будет видимым именно в этой области, а не глобальной области. This means that if you declare a struct or union tag within a prototype, the tag is entered at that scope rather than at global scope. Например, если выполнять компиляцию с параметром /Za в соответствии со стандартом ANSI, эту функцию невозможно будет вызвать без получения ошибки несоответствия типов: For example, when compiling with /Za for ANSI compliance, you can never call this function without getting a type mismatch error:

Чтобы исправить код, определите или объявите struct либо union в глобальной области перед прототипом функции: To correct your code, define or declare the struct or union at global scope before the function prototype:

При использовании параметра /Ze этот тег будет по-прежнему находиться в глобальной области. Under /Ze, the tag is still entered at global scope.

Прототип функции

В общем виде прототип функции должен выглядеть таким образом:

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

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

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

Имеется небольшая, но важная разница в том, как именно в С и C++ обрабатывается прототип функции, не имеющей параметров. В C++ пустой список параметров указывается полным отсутствием в прототипе любых параметров. Например,

Таким образом компилятор узнает, что у функции нет параметров, и любое обращение к ней, в котором имеются аргументы, будет считаться ошибкой. В C++ использование ключевого слова void внутри пустого списка параметров также разрешено, но считается излишним.

Прототипы функций позволяют «отлавливать» ошибки еще до запуска программы. Кроме того, они запрещают вызов функций при несовпадении типов (т.е. с неподходящими аргументами) и тем самым помогают проверять правильность программы.

И напоследок хотелось бы сказать следующее: так как в ранних версиях С синтаксис прототипов в полном объеме не поддерживался, то в С прототипы формально не обязательны. Такой подход необходим для совместимости с С-кодом, созданным еще до появления прототипов. Но если старый С-код переносится в C++, то перед компиляцией этого кода в него необходимо добавить полные прототипы функций. Помните, что хотя прототипы в С не обязательны, но они обязательны в C++. Это значит, что каждая функция в программе на языке C++ должна иметь полный прототип. Поэтому при написании программ на С в них указываются полные прототипы функций — именно так поступает большинство программистов, работающих на этом языке.

Старомодные объявления функций

В «ранней молодости» языка С, еще до создания прототипов функций, все-таки была необходимость сообщить компилятору о типе результата функции, чтобы при вызове функции был создан правильный код. (Так как размеры разных типов данных разные, то размер типа результата надо было знать еще до вызова функции.) Это выполнялось с помощью объявления функции, не содержащего никакой информации о параметрах. С точки зрения теперешних стандартов этот старомодный подход является архаичным. Однако его до сих пор можно найти в старых кодах. По этой причине важно понимать, как он работает.

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

Общий вид старомодного оператора объявления функции такой:

Обратите внимание, что список параметров пустой. Даже если функция принимает аргументы, то ни один из них не перечисляется в объявлении типа.

Как уже говорилось, старомодное объявление функции устарело и не должно использоваться в новом коде. Кроме того, оно несовместимо с C++.

Прототипы старомодных библиотечных функций

C++/Function prototype

Прототип функции в C и C++ — предварительное объявление функции, i.e. объявление функции, не содержащее тела этой функции, но указывающее имя функции, арность, типы аргументов и возвращаемый тип данных.

В то время как определение функции описывает, что именно делает функция, прототип функции может восприниматься как описание её интерфейса.

Содержание

Preamble

Прототипы функции являются важными особенностями языков языке Си и C++ так как в заголовочных файлах указываются именно они (прототипы функций).

Понятие прототипа

«Прототип функции» и «объявление функции» (без инициализации) это одно и то же. Прототип функции это декларация функции (function declaration), а определение функции (function definition) это реализация функции. Пример:

Требования к прототипу

Чтобы компилятор правильно сопоставил прототип (декларацию) и реализацию (определение) функции надо учитывать практически все. При создании прототипа важно всё: название функции, количество аргументов, типы аргументов, значения параметров по-умолчанию, тип возвращаемого значения, модификаторы констант ( const ), передача по ссылке, ссылки, указатели. Всё это должно совпадать в прототипе и определении функции, чтобы компилятор потом их правильно распознал. Не важны только названия переменных в списке аргументов и поэтому их можно не писать. В самих функциях названия переменных в аргументах тоже необязательны, но они требуютcя чтобы получить доступ к этим переменным и поэтому всегда используются.

В прототипе имена аргументов являются необязательными, тем не менее, необходимо указывать тип вместе со всеми модификаторами (например, указатель ли это или константный аргумент).

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

Объявление функции требуется только в случае её использования. Определение функции может располагаться где угодно в программе.

Параметры со значением по-умолчанию

В отличие от многих других лангов программирования, в C++ значения по-умолчанию параметров/аргументов функций/методов указываются только в прототипе/декларации (declaration) функции/метода и не могут указываться в определении/реализации (definition) функции/метода. Указание значения по-умолчанию параметра в определении/реализации (definition) функции/метода вызывает ошибку компилятора. В компиляторе C++ от Microsoft для IDE Visual Studio это ошибка C2572. Пример:

Использование

Уведомление компилятора

Если функция предварительно не была объявлена, а её имя встречается в выражении, сразу за которым следует открывающая скобка, то она неявно объявляется как функция, возвращающая результат типа int и ничего не предполагается о её аргументах. В этом случае компилятор не сможет выполнить проверку типов аргументов и арность, когда функция вызывается с некоторыми аргументами. Это потенциальный источник проблем. Следующий код иллюстрирует ситуацию, в которой поведение неявно объявленной функции не определено.

Функция « foo » ожидает аргумент целого типа, находящийся в стеке при вызове. Если прототип пропущен, компилятор не может это обработать и « foo » завершит операцию на некоторых других данных стека (вероятно, это будет обратный адрес или значение переменной, не входящей в область допустимых значений). Включением прототипа функции вы информируете компилятор о том, что функция « foo » принимает один аргумент целого типа и вы тем самым позволяете компилятору обрабатывать подобные виды ошибок.

Создание библиотечных интерфейсов

Путём помещения прототипов функций в заголовочный файл можно описывать интерфейс для библиотек.

Объявления класса

В C++ прототипы функций также используются в определении классов.

Примеры

Создание прототипа функции solve без её определения:

Прототип объявляет функцию с именем «foo», которая принимает один аргумент «n» целого типа и возвращает целое число:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *