Почему объявление функции является обязательным в C ++, а не в C? - PullRequest
13 голосов
/ 04 мая 2011

Итак, на одном из моих предыдущих экзаменов был такой вопрос, и до сих пор я читал, что вам не нужна декларация на каком-либо из языков?

Что правильно? Будет ли C ++ выдавать ошибку, если нет объявления, или он будет работать?

Ответы [ 4 ]

20 голосов
/ 04 мая 2011

В обсуждении, которое включает как C, так и C ++, «объявление функции» является довольно расплывчатым термином. Эти языки значительно отличаются в этом отношении.

В языке C ++ существует только один вид объявления функции: объявление со всеми типами параметров и типом возвращаемого значения. Такие объявления необходимы, потому что язык C ++ поддерживает функцию с перегрузкой . Чтобы выбрать, какую функцию вызывать, компилятору необходимо знать все о функции и знать, какие перегруженные версии функции доступны. Если вы «забудете» объявить какую-то перегруженную версию, она не будет учитываться при разрешении перегрузки. Это как минимум одна из причин, по которым объявления функций необходимы в C ++.

В языке C существует два вида объявлений функций: не-прототип объявления и прототип объявления (или просто прототипы ). Прототип на C очень похож на объявление C ++ - он включает в себя все типы параметров. Прототипы всегда требовались в стандарте C для функций с переменным числом (функции с параметрами ...). Для невариантных функций объявления prototype не требуются даже сегодня. Но, начиная с C99, для всех остальных функций требуются как минимум объявления, не относящиеся к прототипу . В более старой версии C89 / 90 объявлений функций языка для невариантных функций не требовалось.

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

2 голосов
/ 04 мая 2011

Объявления функций в C не являются обязательными по причинам унаследованной / обратной совместимости - если бы они были сделаны обязательными, какой-то старый / унаследованный код где-то прекратил бы компиляцию.

Я бы предположил, что они являются обязательными в C ++, посколькуC ++ не является строгим надмножеством C и поэтому может сделать разумный выбор, сделав их обязательными.

Однако вы всегда должны объявлять их - см. Этот вопрос Обязательно объявить прототип функции в C?

FYI в объявлениях функции C99 теперь обязательны.

1 голос
/ 04 мая 2011

Объявления функций являются обязательными в C. Прототипы, однако, являются необязательными, за исключением случаев использования переменных функций и функций, чьи типы аргументов будут изменены при повышении по умолчанию.

0 голосов
/ 04 мая 2011

Я не могу ответить за C.

В C ++ для функций:

  • void foo(); - это объявление.
  • void foo() { .. } - этоопределение и декларация.

Перед вызовом foo().

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

...