Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужны ли прототипы функций 
:(
    Опции темы
Чупакабро
Дата 1.10.2012, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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.
PM MAIL   Вверх
baldina
Дата 1.10.2012, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



ты.
либо прототип есть (напрмер, в файле, который включается в stdafx.h)
либо компиляция происходит в режиме С

PM MAIL   Вверх
Чупакабро
Дата 1.10.2012, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



Цитата(baldina @  1.10.2012,  14:24 Найти цитируемый пост)
либо прототип есть 

Нет. Функция моя.
Цитата(baldina @  1.10.2012,  14:24 Найти цитируемый пост)
либо компиляция происходит в режиме С

где это можно посмотреть?
--------------------
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.
PM MAIL   Вверх
baldina
Дата 1.10.2012, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



в настройках проекта

Добавлено через 29 секунд
покажи код, где нет прототипа
PM MAIL   Вверх
volatile
Дата 1.10.2012, 19:33 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Если тело функции находится выше по коду (включаяя инклуды), прототип не нужен.

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

PM MAIL   Вверх
Чупакабро
Дата 1.10.2012, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



Цитата(baldina @  1.10.2012,  18:05 Найти цитируемый пост)
покажи код, где нет прототипа 

Код

int kdfjgnj()
{
        return 0;
}

void sdvsddvsd()
{
    kdfjgnj();
}
Вот на это не ругается.


Цитата(volatile @  1.10.2012,  19:33 Найти цитируемый пост)
Шилдт имелл ввиду прототипы функций-членов (методов класса).Прототипы классов (и естественно прототипы функций входящих в нево) является обязательной необходимостью. 

Я тоже так думал, но этот товарисч написал, что это отличие С++ от С, а так как в С нет классов, то я и подумал, что речь идет про обычные функции.
--------------------
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.
PM MAIL   Вверх
NoviceF
Дата 2.10.2012, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



Цитата(Чупакабро @  1.10.2012,  14:19 Найти цитируемый пост)
В книге Г. Шилдта по С++ прочитал, что одним из отличий С++ от С является необходимость обязательного написания прототипов функций.


У Шилдта "Прототип позволяет компилятору узнать тип значения, возвращаемого функцией, также количество и тип параметров, которые она может иметь. Компилятору нужно знать эту информацию до первого вызова функции".

Там ещё нужно смотреть примеры из книги, где у него определение функции написано после main(). В таком случае естественно, что сначала нужно объявление. А ситуация, когда вместе с объявлением(прототипом) сразу идёт определение, свойственна для inline функций.
PM MAIL   Вверх
Dem_max
Дата 2.10.2012, 04:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Цитата

Я тоже так думал, но этот товарисч написал, что это отличие С++ от С, а так как в С нет классов, то я и подумал, что речь идет про обычные функции.

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


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
baldina
Дата 2.10.2012, 10:08 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(Чупакабро @  1.10.2012,  20:22 Найти цитируемый пост)
int kdfjgnj()
{
        return 0;
}
void sdvsddvsd()
{
    kdfjgnj();
}

все идентификаторы C++ должны быть предварительно объявлены. прототипы функций нужны для их объявления, если сами они (их определение) находится в другой единице компиляции или ниже по тексту.
в данном случае функция kdfjgnj() определена и объявлена выше использования, она сама себе прототип.

PM MAIL   Вверх
xvr
Дата 2.10.2012, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(baldina @  2.10.2012,  10:08 Найти цитируемый пост)
в данном случае функция kdfjgnj() определена и объявлена выше использования, она сама себе прототип.

+1

Кстати, в С точно так же - объявление функции уже является ее прототипом (хотя и не всегда):
Код

int kdfjgnj(void)
{
        return 0;
}
 - является прототипом
Код

int kdfjgnj()
{
        return 0;
}
 - не является

PM MAIL   Вверх
wowka19
Дата 2.10.2012, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



Цитата(xvr @  2.10.2012,  12:42 Найти цитируемый пост)
Кстати, в С точно так же - объявление функции уже является ее прототипом (хотя и не всегда):

Код

int kdfjgnj(void)
{
        return 0;
}

 - является прототипом


Код

int kdfjgnj()
{
        return 0;
}

 - не является


можно вот это пояснить? не пойму чем отличаются эти две записи, разве void не подразумевается и не является чисто формальностю?

Это сообщение отредактировал(а) wowka19 - 2.10.2012, 15:16
PM MAIL   Вверх
xvr
Дата 2.10.2012, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(wowka19 @  2.10.2012,  15:11 Найти цитируемый пост)
разве void не подразумевается и не является чисто формальностю?

В С++ да, в С - нет. Что бы описание функции (равно как и предварительное описание) было прототипом, в нем необходимо указать типы параметров, даже если их вообще нет. Вот тут void и пишут.

PM MAIL   Вверх
wowka19
Дата 2.10.2012, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



значит выше приведенное сравнение относится только к plain C?
Блин, нада почитать книжку Денниса Ритчи.
Вообще странный ход разработчиков языка C не последовать примеру C++. Все-таки по дефолту подразумевать void логично и удобно. Может это пережиток ANSI C и в C99 это работает?
PM MAIL   Вверх
xvr
Дата 2.10.2012, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(wowka19 @  2.10.2012,  16:27 Найти цитируемый пост)
значит выше приведенное сравнение относится только к plain C?

Да

Цитата(wowka19 @  2.10.2012,  16:27 Найти цитируемый пост)
Вообще странный ход разработчиков языка C не последовать примеру C++.

С вроде как бы раньше появился smile

Цитата(wowka19 @  2.10.2012,  16:27 Найти цитируемый пост)
Может это пережиток ANSI C и в C99 это работает? 

Это пережиток еще перехода от K&R к ANSI C. Не уверен, что в С99 это изменили - пострадает совместимость и масса старых программ перестанет компилироваться

PM MAIL   Вверх
wowka19
Дата 3.10.2012, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



Цитата(xvr @  2.10.2012,  21:17 Найти цитируемый пост)
Цитата(wowka19 @  2.10.2012,  16:27 )
Вообще странный ход разработчиков языка C не последовать примеру C++.

С вроде как бы раньше появился 


Я имел ввиду исправления в последующих стандартах, появившихся после C++ (аналогично //)



Цитата(xvr @  2.10.2012,  21:17 Найти цитируемый пост)

Цитата(wowka19 @  2.10.2012,  16:27 )
Может это пережиток ANSI C и в C99 это работает? 

Это пережиток еще перехода от K&R к ANSI C. Не уверен, что в С99 это изменили - пострадает совместимость и масса старых программ перестанет компилироваться


Почему же совместимость пострадает при установлении void по дефолту?

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0613 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.