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

Поиск:

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


Эксперт
****


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

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



Комментарий // появился в C до того, как появился C++ (но может быть, не был включен в стандарт)
f() в C означает, что функция может иметь любые аргументы
в С++ это означает, что функция не имеет аргументов.
typedef void func(); - не переводимо на C++, у typedef void func(...); - немного другой смысл.
PM   Вверх
xvr
Дата 3.10.2012, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(wowka19 @  3.10.2012,  12:27 Найти цитируемый пост)
Почему же совместимость пострадает при установлении void по дефолту?

Потому что нельзя будет сделать функцию без прототипа, а в до-ANSI программах все функции были без прототипа. Так что все старые С библиотеки перестанут собираться.

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


Опытный
**


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

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



Цитата(xvr @  3.10.2012,  14:40 Найти цитируемый пост)
Потому что нельзя будет сделать функцию без прототипа, а в до-ANSI программах все функции были без прототипа. Так что все старые С библиотеки перестанут собираться.


не понял... можно пример
PM MAIL   Вверх
math64
Дата 5.10.2012, 07:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

typedef int func();
struct  A {
int i;
func* pfunc;
};
int f1() { return 0; }
int f2(int n) { return n; }

int main() {
struct A a1, a2;
a1.pfunc = f1;
a2.pfunc  = f2;
a1.i = a1.pfunc();
a2.i = a2.pfunc(a1.i);
return a2.i;
}


Это сообщение отредактировал(а) math64 - 5.10.2012, 07:30
PM   Вверх
xvr
Дата 5.10.2012, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(wowka19 @  4.10.2012,  20:59 Найти цитируемый пост)
не понял... можно пример 

Код

int func(); /* Это предварительное описание, НО НЕ ПРОТОТИП ! */

main()
{
  func(10);
}

int func(int a)
{
 ...
}
Абсолютно правильный код в ANSI C (да и в K&R тоже, если вынести описание типа параметра за скобки). Если не требовать наличие void при описании прототипа - это будет ошибкой. 99.9% всех С библиотек, созданных во времена K&R C перестанут собираться

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


Опытный
**


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

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



Цитата(xvr @  5.10.2012,  10:43 Найти цитируемый пост)
Код

int func(); /* Это предварительное описание, НО НЕ ПРОТОТИП ! */
main()
{
  func(10);
}
int func(int a)
{
 ...
}



так... получается, чтоб компилятор не поперхнулся, дойдя до неизвестной func(10) в main(), достаточно просто указать тип return'а + имя функции БЕЗ параметров (НЕ ПРОТОТИП)?

тогда в чем смысл прототипа? зачем вообще нужен прототип если компилятору хватит и имени?
например:
Код

int func(int); // не соберется?

main()
{
  func(10);
}
int func(int a)
{
 ...
}

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


любитель
****


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

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



Цитата(wowka19 @  5.10.2012,  19:52 Найти цитируемый пост)
 достаточно просто указать 

достаточно было

Цитата(wowka19 @  5.10.2012,  19:52 Найти цитируемый пост)
 зачем вообще нужен прототип 

для контроля соответствия типов и возможных перобразований..


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


Эксперт
****


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

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



Цитата(wowka19 @  5.10.2012,  20:52 Найти цитируемый пост)
тогда в чем смысл прототипа? зачем вообще нужен прототип если компилятору хватит и имени?

В K&R прототипов не было. Там даже необязательно было давать предварительное описание функции, т.е. можно было сделать
Код

int main()
{
 return func(10);
}
Но потом, когда вдоволь находились по граблям с несоответствием типов параметров и вызова, ввели прототипы:
Код

int main()
{
 func(10); // Будет вызов с целым числом в качестве параметра, и как следствие - слом в процессе исполнения
}

void func(a)
 double a;
{
 ...
}

Если добавить прототип, все становится правильно
Код

void func(double);
int main()
{
 func(10); // Целое 10 будет преобразовано в double 10.0, и с ним и будет произведен вызов
}

void func(double a)
{
 ...
}


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


Опытный
**


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

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



Цитата(xvr @  6.10.2012,  18:23 Найти цитируемый пост)
Код

void func(a)
 double a;
{
 ...
}

- это что за синтаксис такой?
PM MAIL   Вверх
baldina
Дата 10.10.2012, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(wowka19 @ 10.10.2012,  02:34)
Цитата(xvr @  6.10.2012,  18:23 Найти цитируемый пост)
Код

void func(a)
 double a;
{
 ...
}

- это что за синтаксис такой?

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

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

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

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

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


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

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


 




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


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

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