![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Sergio |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: 0 Всего: 1 |
Всем привет. Читаю книгу и не могу розобратся с прототипами функции...
И если можно то примерчик какой-нибудь Спасибо. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Sergio, Прототип функции это ее опережающее описание. Он служит знаком компилятору, что где-то в проекте есть процедура с таким имененм и параметрами. Тогда компилятор встречая ее вызов знает, что как передается ей и кроме того он знает, что ее нужно включить в код или подключить из библиотеки. Если реализация функции выше места ее использования, то прототип не нужет, так как вся нужная информация у компилятора уже есть. Если же ее реализация ниже по тексту или вообще в другом моделе или библиотеке, то прототип должен быть обязательно описан перед первым вызовом этой функции.
Прототип представляет собой заголовок функции и параметрами, после которых идет ";" вместо фигурных скобок. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
1.хороший стиль описывать ф-ии в отдельных заголовках, их обьявления находятся в .h, который в свою очередь подключается к нужному файлу проекта.. 2.при описании класса не будешь же ты определять ф-ии внутри класса.. 3. если ф-ия 1 используется в ф-ии 2, тогда придется заботится про определение ф-ии 1 до ф-ии 2, что может запутать при большом кол-ве ф-ий.. обьявления решают все эти проблемы |
|||
|
||||
| EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
что-то вроде этого alexeis1 тупанул Это сообщение отредактировал(а) EvgenZ - 20.10.2006, 15:36 -------------------- <удалено администрацией форума> |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
EvgenZ, А конопочка "КОД" для чего дана?
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| WERITAS |
|
|||
|
******** ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 2.5.2005 Где: Москва Репутация: нет Всего: 5 |
Коротко и ясно: прототип ф-ции нужен, чтобы компилятор видел какие у нее параметры
-------------------- Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак" |
|||
|
||||
| EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
Коротко, но не ясно По функциям не помню, а вот с классами бывает так, что в одном классе используется ссылка на другой класс, а первый класс содержит ссылку на первый, т.е. без первого не создашь второй и наоборот. Для того чтобы скомпилировалось надо сделать объявление одного класса и после описывать второй и потом уже описывать первый. В функциях вроде такая же тема. -------------------- <удалено администрацией форума> |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Если функция вызывает себя (в т.ч. и через другую функцию), то она рекурсивная. Рекурсия используется не очень часто. Но не смотря на это в Си подавляющее большинство функций объявлено прототипами (в .h файлах). WERITAS был прав. |
|||
|
||||
| vinter |
|
||||||||||||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
че то я не понял ты хочешь сказать, что при конструкции
func2() является рекурсивной?? Добавлено @ 18:16 правильно
неправильно
=> EvgenZ прав
никто обратного не утверждал просто
|
||||||||||||
|
|||||||||||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Нет, он хотел сказать что func2 будет рекурсивной при:
|
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
понятно.. замкнутый круг какой-то
|
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Ну, вообще-то в этом случае, как и в обычной рекурсии, хотя бы в 1-ой из функций присутствуют условия окончания рекурсии.
В выложенном варианте - да, stack overflow обеспечен... |
|||
|
||||
| Sergio |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: 0 Всего: 1 |
Народ, то я так понял что прототип функция - это обявление функции (перед функцией main) и всё???
|
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Чтобы компилятор знал эту функцию
|
|||
|
||||
| EvgenZ |
|
||||||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
Да я собственно и не говорил, что неправильно, я просто сказал, что непонятно. Самый простой, надежный и логичный способ спросить это у того, кому предназначалась эта строка. Sergio в С выполнение (и просмотр при компиляции) идет построчно, т.е.
у тебя будет ошибка, так как ты пытаешься использовать переменную которой еще нет во второй строке приведенного примера, но она есть дальше!!! Таже ситуация с функциями, компилятор смотрит, что есть функция (а функция в свою очередь должна быть, как все функции в С, уникальной. Что дает уникальность? - правильно, имя и список параметров) которая используется в данном куске, он вдиит, что она объявлена и дает компилировать, а если не находит, то.... vinter респект -------------------- <удалено администрацией форума> |
||||||
|
|||||||
| Sergio |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: 0 Всего: 1 |
Но я не пойму зачём это делать??
|
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Из-за идиомы заголовок-реализация. Ты подключаешь только заголовки(*.h или *.hpp), из которых компилятор узнает об определениях. А сам код непосредсвенно компилируется отдельно(*.c или *.cpp) в объектные файлы. Советую почитать книги по С++. Там об этом пишут. |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Sergio, Если определишь функцию до функции из которой ее вызываешь - пожалуйста, можешь забить на прототипы
Прототип функции может быть пропущен, если определение функции следует до первого ее вызова из другой функции, хотя это не привествуется в программировании, ибо бывают случаи перекрестных вызовов - две или несколько функций вызывают друг друга, в результате чего невозможно вызывать одну функцию без предворительного определения другой. Это сообщение отредактировал(а) Xenon - 21.10.2006, 00:06 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Проще, если программа маленькая и состоит из не более чем десяти функций. Но когда количество функций исчисляется сотнями, то ты помрешь при отладке (я уж не говорю про компиляцию - поменял 1 на 2, и все компилируется заново). Поэтому такие крупные программы разбивают на модули, а связь между модулями реализуют через заголовочные файлы. И изменив один из файлов, тебе придется скомпилировать только его, а не все. Да и отлаживать проще, так как судя по ошибке ты сразу определяешь в каком модуле проблема и уже ищешь ошибку в 10 функциях, а не в нескольких сотнях. |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Вот, например ...
Компилятор тебя пошлет нафиг, так как он скажет: "А кто такая func2()?". Без прототипа не обойтись. Пример глупый и тут, конечно, как нефиг делать - можно просто func2 определить перед main() и все, но бывают примеры посложнее где иначе никак |
|||
|
||||
| knut |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 7.2.2006 Репутация: нет Всего: нет |
Sergio,
допустим у тебя етсть функц. func а эту вункц ты реализуеш отдельно а вызов происхоет в маин. вот если не будет прототипа то компилятор не узнает о какой функц идет речь P.S он конечно умный но не до такой степени.
--------------------
|
||||
|
|||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
ВСе привели один и тот же пример, в принципе
Если человек и сейчас не поймет, то я уже не знаю как объяснить |
|||
|
||||
| Sergio |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: 0 Всего: 1 |
Народ, то я так понял, что функции прототипы, это как абстрактные функции в класах (без определения, только заголовок). А реализация может быть в середине другой функции. Правильно или нет?
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
неправильно! Реализация не может находиться в другой функции - по определению. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
В с++ Функции могут находится только внутри модуля, но не внутри некоторой функции. Такая штука возможна только в паскале.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Sergio |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: 0 Всего: 1 |
Тепер понял.
|
|||
|
||||
| UnrealMan |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
... и возвращаемое значение. Однако в отношении классов иногда важен ещё и их размер. Тогда одним объявлением не обойдёшься:
Что касается функций, то в редких случаях их объявление может пригодиться как средство разрешения области видимости:
|
||||||
|
|||||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
UnrealMan, откуда информация насчет не принятия участия в перегрузке?
То есть если я в этом случае вызову
Вызовется Func(int) ??? |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Век живи, век учись...
Респект, господа... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |