![]() |
|
Модераторы: bsa |
![]()
|
|
| Чупакабро |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 27.2.2007 Репутация: нет Всего: 4 |
В книге Г. Шилдта по С++ прочитал, что одним из отличий С++ от С является необходимость обязательного написания прототипов функций.
Однако MSVS 2010 хавает функцию без прототипа и даже не давится. Кто здесь неправ? --------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue. |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
ты.
либо прототип есть (напрмер, в файле, который включается в stdafx.h) либо компиляция происходит в режиме С |
|||
|
||||
| Чупакабро |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 27.2.2007 Репутация: нет Всего: 4 |
Нет. Функция моя. где это можно посмотреть? --------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue. |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
в настройках проекта
Добавлено через 29 секунд покажи код, где нет прототипа |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Если тело функции находится выше по коду (включаяя инклуды), прототип не нужен.
Шилдт имелл ввиду прототипы функций-членов (методов класса). Прототипы классов (и естественно прототипы функций входящих в нево) является обязательной необходимостью. |
|||
|
||||
| Чупакабро |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 27.2.2007 Репутация: нет Всего: 4 |
Я тоже так думал, но этот товарисч написал, что это отличие С++ от С, а так как в С нет классов, то я и подумал, что речь идет про обычные функции. --------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue. |
|||
|
||||
| NoviceF |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 13.3.2012 Где: Ростов-на-Дону Репутация: 2 Всего: 2 |
У Шилдта "Прототип позволяет компилятору узнать тип значения, возвращаемого функцией, также количество и тип параметров, которые она может иметь. Компилятору нужно знать эту информацию до первого вызова функции". Там ещё нужно смотреть примеры из книги, где у него определение функции написано после main(). В таком случае естественно, что сначала нужно объявление. А ситуация, когда вместе с объявлением(прототипом) сразу идёт определение, свойственна для inline функций. |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
Не важно Си или С++. Прототипы (функций, классов, объявлений) нужны чтобы все объекты компиляции (если они используют функции из других объектов компиляции) знали что гдето в другом объекте компиляции имеется такая функция. А уже линкер при сборке объектных файлов проверяет есть ли уже настоящие функции, а не прототипы. -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
все идентификаторы C++ должны быть предварительно объявлены. прототипы функций нужны для их объявления, если сами они (их определение) находится в другой единице компиляции или ниже по тексту. в данном случае функция kdfjgnj() определена и объявлена выше использования, она сама себе прототип. |
|||
|
||||
| xvr |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
+1 Кстати, в С точно так же - объявление функции уже является ее прототипом (хотя и не всегда):
|
||||||
|
|||||||
| wowka19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
можно вот это пояснить? не пойму чем отличаются эти две записи, разве void не подразумевается и не является чисто формальностю? Это сообщение отредактировал(а) wowka19 - 2.10.2012, 15:16 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
||||
|
||||
| wowka19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
значит выше приведенное сравнение относится только к plain C?
Блин, нада почитать книжку Денниса Ритчи. Вообще странный ход разработчиков языка C не последовать примеру C++. Все-таки по дефолту подразумевать void логично и удобно. Может это пережиток ANSI C и в C99 это работает? |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
||||
|
||||
| wowka19 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
Я имел ввиду исправления в последующих стандартах, появившихся после C++ (аналогично //)
Почему же совместимость пострадает при установлении void по дефолту? |
||||
|
|||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |