Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.51/73: Рейтинг темы: голосов - 73, средняя оценка - 4.51
Syltan
240 / 8 / 7
Регистрация: 27.08.2009
Сообщений: 868
1

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

27.08.2009, 22:49. Просмотров 13250. Ответов 21
Метки нет (Все метки)

Скажите,какой смысл описывать протип функции, тоесть первую строчку функции, прописывать ещё раз вверху, перед функцией main(). Что это даёт,я так и не понял?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2009, 22:49
Ответы с готовыми решениями:

прототип функции
Использовать прототип функции То есть заголовок перед функцией main, а...

Прототип функции
нужно написать прототип функции, которая имеет имя f1, возвращает вещественное...

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

Прототип функции
Записать прототип функции, которая осуществляет перевод десятичного числа в...

Прототип функции
Всем салют! Помогите пожалуйста с прототипом функции, очень прошу всех-сильно...

21
Vourhey
Почетный модератор
6493 / 2268 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
27.08.2009, 22:52 2
А если у тебя функция используется в мэйн до ее определения? Его наверх переносить? Два раза прогонять?
А если писать по правилам, то ты все определения функций в одном месте с кодом держишь? Хорошо бы в отдельный заголовочный файл с прототипами и отдельный спп-файл с реализациями.
0
Syltan
240 / 8 / 7
Регистрация: 27.08.2009
Сообщений: 868
27.08.2009, 22:56  [ТС] 3
Дайте пример пожалуйста,если не сложно,чтоб увидеть и понять, зачем нужен прототип функции.
0
Vourhey
Почетный модератор
6493 / 2268 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
27.08.2009, 22:58 4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
using namespace std;
 
void show();
 
int main()
{
    show();
    cin.get();
    return 0;
}
 
void show()
{
    cout<<"func "<<endl;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
using namespace std;
 
int main()
{
    show();
    cin.get();
    return 0;
}
 
void show()
{
    cout<<"func "<<endl;
}
Добавлено через 1 минуту
До более нормальных примеров современем дойдешь сам.
0
AnonymC
1179 / 464 / 86
Регистрация: 23.06.2009
Сообщений: 6,375
Завершенные тесты: 1
27.08.2009, 22:58 5
Syltan, что за прототип?...напиши код ниче не понял...
для таких вопросох книжки существуют
0
Evg
Эксперт CАвтор FAQ
19354 / 7203 / 538
Регистрация: 30.03.2009
Сообщений: 20,146
Записей в блоге: 30
27.08.2009, 23:01 6
@lex, в примере из поста 4 "void show();" называется словом "прототип". Т.е. описание типов параметров и типа результата функции без определения тела самой функции
0
Vourhey
Почетный модератор
6493 / 2268 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
27.08.2009, 23:04 7
Evg, думаю, автор ставил вопрос так "а нафига мне описывать типы, параметры и тип результата функции без определения тела самой функции" ))
0
novi4ok
551 / 504 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
27.08.2009, 23:08 8
Цитата Сообщение от Syltan Посмотреть сообщение
Скажите,какой смысл описывать протип функции, тоесть первую строчку функции, прописывать ещё раз вверху, перед функцией main(). Что это даёт,я так и не понял?
в принципе в с++ вы можете функцию не декларировать, а сразу определять. но условие: компилятор должен прочесть ее до первого обращения к ней.
иногда вы обязаны декларировать "раньше". например, если вы пишете библиотеку, которую будете поставлять вместе с заголовочным файлом.
0
Evg
Эксперт CАвтор FAQ
19354 / 7203 / 538
Регистрация: 30.03.2009
Сообщений: 20,146
Записей в блоге: 30
27.08.2009, 23:10 9
Цитата Сообщение от Vourhey Посмотреть сообщение
Evg, думаю, автор ставил вопрос так "а нафига мне описывать типы, параметры и тип результата функции без определения тела самой функции" ))
Дык я не автору отвечал, а товарищу, который вопрос автора не осилил
0
Syltan
240 / 8 / 7
Регистрация: 27.08.2009
Сообщений: 868
27.08.2009, 23:13  [ТС] 10
Тоесть прототип функции, описуется после
C++
1
using namespace std;
для того,чтоб можно было вызвать функцию раньше,чем она описана. Тоесть вначале вызвать, а потом описать её.
0
HIMen
4265 / 1432 / 101
Регистрация: 12.04.2009
Сообщений: 2,346
27.08.2009, 23:17 11
Syltan, я тоже раньше не понимал, зачем это нужно, разобрался только когда в проектах появилось по несколько .h и .cpp.
Если у тебя один .h включен в несколько других .h то компилятор будет ругаться
one or more multiply defined symbols found
поэтому надо разделять заголовки в .h и сами функции в .cpp
0
Evg
Эксперт CАвтор FAQ
19354 / 7203 / 538
Регистрация: 30.03.2009
Сообщений: 20,146
Записей в блоге: 30
27.08.2009, 23:17 12
Цитата Сообщение от Syltan Посмотреть сообщение
Тоесть прототип функции, описуется после
C++
1
using namespace std;
для того,чтоб можно было вызвать функцию раньше,чем она описана. Тоесть вначале вызвать, а потом описать её.
Правильно. только фразу "описуется после using namespace std;" надо вычеркнуть. Когда компилятор видит вызов "func (10, 20);" то к этому моменту он должен знать, какие типы параметров и сколько их вообще. Если функция описана "ниже", то без прототипа будет ошибка
1
novi4ok
551 / 504 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
27.08.2009, 23:29 13
Цитата Сообщение от Syltan Посмотреть сообщение
Тоесть прототип функции, описуется после
C++
1
using namespace std;
для того,чтоб можно было вызвать функцию раньше,чем она описана. Тоесть вначале вызвать, а потом описать её.
странный подход. вы о компиляции говорите, или о выполнении?
а с
C++
1
using namespace std;
это вообще никак не связано
0
Syltan
240 / 8 / 7
Регистрация: 27.08.2009
Сообщений: 868
27.08.2009, 23:30  [ТС] 14
О компиляции,что программа не скомпилится, если не поставить после этой строки, но оказывается наверное это ошибочно считать, тоесть по словам Эвга.
0
novi4ok
551 / 504 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
27.08.2009, 23:36 15
Цитата Сообщение от Syltan Посмотреть сообщение
О компиляции,что программа не скомпилится, если не поставить после этой строки, но оказывается наверное это ошибочно считать, тоесть по словам Эвга.
короче: компилятор не скомпилирует обращение к фии, если не будет каким-то образом знать формат фии. он просто не сумеет это правильно сделать.
0
Vourhey
Почетный модератор
6493 / 2268 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
27.08.2009, 23:41 16
Прототипом ты просто показываешь, что у тебя есть такая-то функция. Где она будет определена не суть важно. Я до вызова main указал, что show есть. Все.
0
Evg
Эксперт CАвтор FAQ
19354 / 7203 / 538
Регистрация: 30.03.2009
Сообщений: 20,146
Записей в блоге: 30
27.08.2009, 23:44 17
Цитата Сообщение от novi4ok Посмотреть сообщение
короче: компилятор не скомпилирует обращение к фии, если не будет каким-то образом знать формат фии. он просто не сумеет это правильно сделать.
В Си в большинстве случаев будет только предупреждение. В Си++ - ошибка
0
novi4ok
551 / 504 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
28.08.2009, 00:06 18
Цитата Сообщение от Vourhey Посмотреть сообщение
Прототипом ты просто показываешь, что у тебя есть такая-то функция. Где она будет определена не суть важно. Я до вызова main указал, что show есть. Все.
важно не только "есть", а еще и "какая". иначе обращение к ней невозможно скомпилировать. в принципе допускаю, что компилятор может быть многопроходным (он такой и есть), и в одном из проходов собирать только информацию о всех существующих ф-ях, и ругаться только если уже все прошли, но вот вызывается ф-я, декларация которой не была найдена в предыдущих проходах. но те несколько компиляторов, которые мне приходилось юзать, ругаются, если до момента вызова прототип не был где-то встречен.
0
odip
Эксперт С++
7164 / 3222 / 77
Регистрация: 17.06.2009
Сообщений: 14,160
28.08.2009, 00:09 19
2novi4ok: дело не в проходах компилятора. Компилятору если нужно - он и 10 проходов сделает. Дело в том, как по стандарту должен реагировать компилятор на отсутствие прототипа. Вот как в стандарте написано - так и реагирует
0
Evg
Эксперт CАвтор FAQ
19354 / 7203 / 538
Регистрация: 30.03.2009
Сообщений: 20,146
Записей в блоге: 30
28.08.2009, 00:11 20
Цитата Сообщение от novi4ok Посмотреть сообщение
но те несколько компиляторов, которые мне приходилось юзать, ругаются, если до момента вызова прототип не был где-то встречен.
А ты попробуй компиляторы Си, а не Си++ - картина будет несколько другая. Как odip верно подметил - эте не прихоть компилятора, а стандарт языка
0
28.08.2009, 00:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2009, 00:11

прототип функции
сделал стандуртную программу нахождения max в массиве с помощью фунцкции... а...

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

Прототип функции
Как правильно: void mul(int x, int y); int main() { } void mul(int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru